2013-02-23 4 views
3

Я пытаюсь экспортировать данные структуры 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); 

Некоторые из них не имеют ДЕЙСТВИТЕЛЬНО, некоторые возвращаемые значения для мусора, а некоторые вызывают сбои.

+0

В чем проблема? – wRAR

+0

Как написать функцию C++ 'Export'? – Lazlo

+0

У вас проблемы с подписью или с телом? Что вы уже пробовали? – wRAR

ответ

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(); 

(Untested)

+0

Протестировано, работает! Будет принимать, когда S/O позволяет мне. – Lazlo

Смежные вопросы