Как экспортировать данные C ++ в структуру C #?

Я пытаюсь экспортировать данные структуры C ++ в C #.

Скажем, у меня есть следующая структура, представляющая вектор с 3-мя числами с плавающей точкой:

// C++
struct fvec3
{
public:
float x, y, z;
fvec3(float x, float y, float z) : x(x), y(y), z(z) { }
};

// C#
[StructLayout(LayoutKind.Sequential)]
struct fvec3
{
public float x, y, z;

public fvec3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
}

Теперь, если бы я хотел использовать fvec3 из C # в C ++ я могу использовать следующее без проблем:

// C++
__declspec(dllexport) void Import(fvec3 vector)
{
std::cout << vector.x << " " << vector.y << " " << vector.z;
}

// C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Import(fvec3 vector);

...

Import(new fvec3(1, 2, 3)); // Prints "1 2 3".

Теперь проблема заключается в том, чтобы сделать наоборот: вернуть C ++ fvec3 в C #. Как я могу это сделать?
Я видел много реализаций C #, использующих что-то вроде этого:

// C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Export(out fvec3 vector);

...

fvec3 vector;
Export(out vector); // vector contains the value given by C++

Но как мне написать C ++ Export функционировать?

Я перепробовал все, что мог придумать и для подписи, и для тела:

// Signatures:
__declspec(dllexport) void Export(fvec3 vector)
__declspec(dllexport) void Export(fvec3* vector)
__declspec(dllexport) void Export(fvec3& vector)

// Bodies (with the pointer variants)
vector = fvec3(1, 2, 3);
memcpy(&fvec3(1, 2, 3), &vector, sizeof(fvec3));
*vector = new fvec(1, 2, 3);

Некоторые из них не имеют эффет, некоторые возвращают значения мусора, а некоторые вызывают сбои.

4

Решение

ref а также out параметры обычно сопоставляются с аргументами указателя.

Попробуй это:

__declspec(dllexport) void Export(fvec3 *vector)
{
*vector = fvec3(1, 2, 3);
}

(Непроверенные)


Кроме того, вы можете просто вернуть fvec3 из вашей функции:

// C++
__declspec(dllexport) fvec3 Export(void)
{
return fvec3(1, 2, 3);
}

// C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern fvec3 Export();

...

fvec3 vector = Export();

(Непроверенные)

4

Другие решения

Если вы хотите изменить все коды, вы можете использовать это программное обеспечение:
http://www.tangiblesoftwaresolutions.com/Product_Details/CPlusPlus_to_CSharp_Converter_Details.html

-2

По вопросам рекламы [email protected]