Как использовать DLLImport со структурами в качестве параметров в C #? - PullRequest
9 голосов
/ 23 марта 2009

Все примеры, которые я могу найти, используя DLLImport для вызова кода C ++ из C #, передают целые числа вперед и назад. Я могу заставить эти примеры работать просто отлично. Метод, который мне нужно вызвать, принимает в качестве параметров импорта две структуры, и я не совсем понимаю, как я могу заставить эту работу работать.

Вот что мне нужно для работы:

У меня есть код C ++, поэтому я могу вносить в него любые изменения / дополнения, которые мне нужны.

Стороннее приложение загружает мою DLL при запуске и ожидает, что DLLExport будет определен определенным образом, поэтому я не могу реально изменить сигнатуру метода, которая экспортируется.

Приложение C #, которое я создаю, будет использоваться в качестве оболочки, чтобы я мог интегрировать этот кусок C ++ в некоторые другие наши приложения, которые все написаны на C #.

Подпись метода C ++, которую мне нужно вызвать, выглядит следующим образом

DllExport int Calculate (const MathInputStuctType *input, 
    MathOutputStructType *output, void **formulaStorage)

И MathInputStructType определяется следующим образом

typedef struct MathInputStuctTypeS {
    int             _setData;
    double              _data[(int) FieldSize];
    int             _setTdData;
} MathInputStuctType;

Ответы [ 4 ]

9 голосов
/ 23 марта 2009

В теме MSDN Передача структур есть хорошее введение в передачу структур в неуправляемый код. Вы также захотите взглянуть на маршалинг данных с использованием платформы Platform Invoke и маршалинг массивов типов .

4 голосов
/ 23 марта 2009

Из опубликованной вами декларации ваш код C # будет выглядеть примерно так:

[DllImport("mydll.dll")]
static extern int Calculate(ref MathInputStructType input,
    ref MathOutputStructType output, ref IntPtr formulaStorage);

В зависимости от структуры MathInputStructType и MathOutputStructType в C ++ вам придется также приписывать эти объявления структуры, чтобы они правильно компоновались.

3 голосов
/ 23 марта 2009

Для структуры:

struct MathInputStuctType 
{
    int       _setData;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = FieldSize)]
    double[]  _data;
    int       _setTdData;
}
2 голосов
/ 23 марта 2009

Возможно, вы захотите взглянуть на этот проект на CodePlex, http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. Это должно помочь вам правильно распределить структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...