2009-03-23 10 views
8

Wszystkie przykłady, które można znaleźć przy użyciu DLLImport do wywoływania kodu C++ z C# przechodzi ints iz powrotem. Mogę sprawić, żeby te przykłady działały dobrze. Metoda, której potrzebuję, wywołuje, pobiera dwie struktury jako parametry importu i nie wiem dokładnie, jak mogę to wykonać.Jak korzystać z DLLImport z structs jako parametry w C#?

Oto co mam do pracy z:

Jestem właścicielem kodu C++, więc mogę zrobić jakieś zmiany/dodatki do niego, że muszę.

Aplikacja strony trzeciej ładuje moją bibliotekę DLL podczas uruchamiania i oczekuje, że definicja DLLExport zostanie zdefiniowana w określony sposób, więc nie mogę zmienić podpisu metody, który został wyeksportowany.

Aplikacja C#, którą buduję, będzie używana jako opakowanie, więc mogę zintegrować ten fragment C++ z niektórymi z naszych innych aplikacji, które są napisane w języku C#.

C++ metoda podpis Muszę zadzwonić wygląda to

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

I MathInputStructType jest zdefiniowana jako następujące

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

Odpowiedz

4

z deklaracji pan pisał, Twój kod C# będzie wyglądać mniej więcej tak :

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

W zależności od struktury MathInputStructTyp e i MathOutputStructType w C++, będziesz musiał również przypisać te deklaracje struktury, aby poprawnie działały.

+0

Brakuje nazwy funkcji btw :) – leppie

+0

"Będziesz musiał również przypisać te deklaracje struktury, tak aby poprawnie działały." Racja, to część, której tak naprawdę nie rozumiem. Dodałem strukturę do mojego pytania. –

3

Dla struct:

struct MathInputStuctType 
{ 
    int  _setData; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = FieldSize)] 
    double[] _data; 
    int  _setTdData; 
} 
+0

Nie jestem pewien, czy jest to w 100% konieczne, ale powinieneś ustawić ArraySubType na UnmanagedType.R8 dla pola _data. – JaredPar

+0

Należy to wywnioskować (przypuszczam, że Marshaller jest całkiem niezły). – leppie

2

Możecie zajrzeć do tego projektu na CodePlex, http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. Powinno to pomóc w prawidłowym uporządkowaniu struktur.

+0

To wygląda świetnie i wszystko, ale bez względu na to, jakie DLL wybiorę, ciągle mi mówi, że spodziewa się manifestu. Wygląda jak fajne narzędzie, jeśli działa. –

+0

Nie wiedziałem, że to było restrykcyjne, przepraszam za to. – LanceSc

+0

Bez obaw, dziękuję za pomoc. –