2010-05-06 4 views
2

Ceci est mon premier post ici! J'essaie de créer un programme Windows Forms en utilisant C# qui utilisera une bibliothèque C précompilée. Il va accéder à une carte à puce et en fournir une sortie. Pour la bibliothèque, j'ai un .dll, .lib et .h et aucune source. Dans le fichier .h, plusieurs structures sont définies. Les fonctions les plus intéressantes du fichier .dll attendent des pointeurs vers des structures allouées en tant qu'arguments. J'ai appelé fonctions à l'intérieur du .dll comme ceci: Par exemple la fonctionComment appeler les fonctions à l'intérieur d'un DLL qui prend les pointeurs comme arguments de C#

EID_API int WINAPI EidStartup(int nApiVersion); 

serait appelé comme ça

[DllImport("CelikApi.dll")]//the name of the .dll 
public static extern int EidStartup(int nApiVersion); 

Maintenant, mon problème est que je ne peux pas trouver l'équivalent des pointeurs de C qui pointer vers des structures dynamiquement allouées en mémoire en C#, donc je ne sais pas quoi passer en argument aux fonctions qui prennent des pointeurs en C.

Je n'ai pas beaucoup d'expérience en C#, mais pour moi, son utilisation était la façon la plus simple de créer le programme dont j'avais besoin. J'ai essayé avec C++, mais Visual Studio 2010 n'a pas IntelliSense pour C++/CLR. Si vous pouvez me diriger vers quelque chose de mieux, n'hésitez pas à le faire.

Répondre

1

Vous pouvez faire quelque chose comme

[DllImport("Operations.dll")] 
    public static extern void Operation(
     [MarshalAs(UnmanagedType.LPArray)]ushort[] inData, 
     int inSize1, int inSize2, 
     [MarshalAs(UnmanagedType.LPArray)]int[] outCoords, 
     ref int outCoordsSize); 

Ce code prendra un tableau alloué dynamiquement de courts métrages non signés (ushort en C#), ainsi que des paramètres de taille multiples (inSize1 et inSize2), et placer les résultats dans le OutCoords tableau de taille outCoordsSize.

Votre code C ne peut pas allouer de mémoire et attendez que C# joue bien avec; C# devrait allouer toute la mémoire avec laquelle votre code C joue. Dans le cas ci-dessus, vous pouvez placer la taille du tableau outCoords dans outCoordsSize, puis remplacer la valeur de outCoordsSize par la quantité de mémoire réellement utilisée (qui ne peut pas dépasser la quantité de mémoire allouée à l'origine sans exception).

Questions connexes