[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]
Вызов unmanaged DLLs из C# и соответствие типов CLR и WINAPI
Нужно вызвать эту функцию из C# и передать туда вектор Double[] a = new Double[Size] (ну а точнее указатель на первый элемент, как выцарапать этот указатель?).
Вообще понадобилось использовать SSE2 в явном виде в C#, никаких классов в .NET для этого нет, решил написать библиотеку с основными функциями и встрял вот на такой штуке.
Всем присутствующим спасибо.
DOUBLE* a передавай как InPtr. А в unmanaged функции есть параметр, отвечающий за размер буфера?? Приведи прототип функции на C++.
extern "C" __declspec(dllexport) BOOL Product(DOUBLE* a, DOUBLE* b, DOUBLE* c, INT size)
Код:
При условии, если в size храниться размер каждого из массивов.
Код:
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;
}
{
__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();
}
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();
}
Код:
[FONT=Courier New][DllImport("StreamingSIMDExtWrap.dll")]
public unsafe static extern void Product(double* a, double* b);[/FONT]
public unsafe static extern void Product(double* a, double* b);[/FONT]