Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов unmanaged DLLs из C# и соответствие типов CLR и WINAPI

16K
22 ноября 2006 года
Sonntex
5 / / 21.03.2006
В DLL написанной на C++ есть экспортируемая функция с входным параметром DOUBLE* a, где a это адрес первого элемента вектора.

Нужно вызвать эту функцию из C# и передать туда вектор Double[] a = new Double[Size] (ну а точнее указатель на первый элемент, как выцарапать этот указатель?).

Вообще понадобилось использовать SSE2 в явном виде в C#, никаких классов в .NET для этого нет, решил написать библиотеку с основными функциями и встрял вот на такой штуке.

Всем присутствующим спасибо.
273
22 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
DOUBLE* a передавай как InPtr. А в unmanaged функции есть параметр, отвечающий за размер буфера?? Приведи прототип функции на C++.
16K
22 ноября 2006 года
Sonntex
5 / / 21.03.2006
extern "C" __declspec(dllexport) BOOL Product(DOUBLE* a, DOUBLE* b, DOUBLE* c, INT size)
273
23 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
Вроде так:
 
Код:
[SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]DllImport[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#800000]"YourNativeDll.dll"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New])][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2]: [/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Bool)][/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff]static [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]extern [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]bool[/COLOR][/SIZE][SIZE=2] Product([[/SIZE][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].LPArray, SizeParamIndex = 3)] [/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] a,[/FONT][/SIZE]
[SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].LPArray, SizeParamIndex = 3)] [/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] b,[/FONT][/SIZE]
[SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].LPArray, SizeParamIndex = 3)] [/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] c,[/FONT][/SIZE]
[SIZE=2][FONT=Courier New][[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]MarshalAs[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]UnmanagedType[/COLOR][/SIZE][SIZE=2].I4)] [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] size);[/SIZE][/FONT]

При условии, если в size храниться размер каждого из массивов.
16K
27 ноября 2006 года
Sonntex
5 / / 21.03.2006
Спасибо. Но окончательно так и не разобрался. В Product выскакивает ошибка - Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Как обойти эту проблему?

Код:
extern "C" __declspec(dllexport) void Product(double* a, double* b)
{
    __asm
    {
        movups xmm0, a     
        movups xmm1, b
        mulps  xmm1, xmm0
        movups a, xmm1
    }

    cout << a[0] << endl;
}


Код:
[DllImport("StreamingSIMDExtWrap.dll")]
public static extern void Product(
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)] double[] a,
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)] double[] b);

static void Main(string[] args)
{
    Double[] a = { 0.0, 0.0, 0.0, 0.0 };
    Double[] b = { 1.0, 2.0, 3.0, 4.0 };
           
    Product(a, b);

    Console.Read();
}
273
02 декабря 2006 года
3A3-968M
1.2K / / 22.12.2005
Попробуй передать unsafe указатели на C#:
 
Код:
[FONT=Courier New][DllImport("StreamingSIMDExtWrap.dll")]
public unsafe static extern void Product(double* a, double* b);[/FONT]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог