2009-03-23 8 views
8

Tous les exemples que je peux trouver en utilisant DLLImport pour appeler le code C de C# passe ints avant et en arrière. Je peux obtenir ces exemples qui fonctionnent très bien. La méthode que j'ai besoin d'appeler prend deux structures comme ses paramètres d'importation, et je ne comprends pas exactement comment je peux faire fonctionner cela.Comment utiliser DLLImport avec des structures comme paramètres dans C#?

Voici ce que je dois travailler avec:

Je possède le code C++, donc je peux apporter des modifications/ajouts à ce que je dois.

Une application tierce va charger ma DLL au démarrage et s'attend à ce que DLLExport soit définie d'une certaine manière, donc je ne peux pas vraiment changer la signature de méthode qui est exportée.

L'application C# Je construis va être utilisé comme emballage pour que je puisse intégrer cette C++ morceau dans certains de nos autres applications, qui sont tous écrits en C#.

Le C++ signature de la méthode que je dois appeler ressemble à ce

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

Et MathInputStructType est défini comme le

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

Répondre

4

de la déclaration que vous avez publié, votre code C# ressemblera à quelque chose comme ça :

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

Selon la structure de MathInputStructTyp e et MathOutputStructType en C++, vous devrez également attribuer ces déclarations de structure afin qu'elles soient correctement référencées.

+0

pas le nom de la fonction btw :) – leppie

+0

« vous allez devoir attribuer ces déclarations de structure et de sorte qu'ils maréchal correctement. » Bon, c'est la partie que je ne comprends pas vraiment. J'ai ajouté la structure à ma question. –

3

Pour la struct:

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

Je ne suis pas sûr que ce soit 100% nécessaire, mais vous devez définir l'ArraySubType à UnmanagedType.R8 pour le champ _data. – JaredPar

+0

Cela devrait être déduit (je suppose, comme le marshaller est plutôt bon). – leppie

2

Vous voudrez peut-être regarder ce projet sur CodePlex, http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. Cela devrait vous aider à assembler correctement les structures.

+0

Cela semble cool et tout, mais peu importe quelle DLL je choisis, il ne cesse de me dire que s'attend à un manifeste. On dirait un outil sympa si ça a marché. –

+0

Je ne savais pas que c'était si restrictif, désolé à ce sujet. – LanceSc

+0

Pas de soucis, merci pour l'aide. –

Questions connexes