Трехмерная векторная структура от c ++ до C # - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь перенести некоторые функции с моего движка с c ++ на C #. Я компилирую свой движок как dll с неуправляемым c ++ и использую только внешние функции "C" в оболочке C #.

У меня есть различные функции, которые принимают и возвращают Vector3df. Это определяется как

typedef Vector3d<f32> Vector3df;

и f32 на самом деле float. Сам класс не имеет ничего, кроме некоторых членов с именами x y и z и множества методов.

Я могу переписать весь класс в C #, это не проблема, но есть ли в любом случае совпадение 2?

Давайте возьмем для примера следующие функции:

extern "C" void SetColor(Vector3df color)
extern "C" Vector3df GetColor()

Я хотел бы иметь что-то подобное в C #:

[DllImport("Engine.dll", EntryPoint = "SetColor", CallingConvention = CallingConvention.Cdecl)]
static extern void SetColor(Vector3df color);
[DllImport("Engine.dll", EntryPoint = "GetColor", CallingConvention = CallingConvention.Cdecl)]
static extern Vector3df GetColor();

Есть ли какой-нибудь способ, которым я мог бы сделать код, похожий на эту работу?

Обратите внимание, что я ни в коем случае не гуру C #. Я заблудился, когда дело доходит до маршалинга. В основном я делаю это, чтобы создать редактор карт для моей игры, не изучая Qt или wxWidgets.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Все, что вам нужно сделать, это определить структуру C #, которая имеет двоичную компоновку, эквивалентную той, которую ожидает dll c ++.Предполагая только x, y, z без упаковки, это просто ...

[StructLayout(LayoutKind.Sequential)] //Required, as default layout is Auto
struct Vector3df {
    public float x, y, z;
}

Это должно работать с указанными вами сигнатурами функций C и C #.Трудность возникает, если вы хотите вызвать какой-либо метод в классе Vector3df, потому что вы не можете p / вызвать методы класса C ++.Вам нужно обернуть каждый из методов как обычную функцию C, как вы это делали с помощью Set / GetColor.

В конечном итоге вам придется много работать, если вы пытаетесь импортировать большую библиотеку, иможет быть проще использовать C ++ / CLI для создания оболочки.Другим вариантом может быть исследование с использованием cxxi , но у меня нет опыта использования этого.

1 голос
/ 16 февраля 2012

Самый простой способ - создать еще одну DLL-оболочку C ++ / CLI, в которой выполняется преобразование между неуправляемыми и управляемыми классами C ++.

...