2010-10-11 28 views
2

Donc en Visual Studio j'ai ma solution avec deux projets, le premier est le code C++ géré et le second est la bibliothèque C++ non gérée (waffles). Je veux utiliser des classes de la bibliothèque dans mon code managé.Utilisation de la bibliothèque non gérée

Si j'ajoute simplement 'include' GMacros.h "', alors je reçois l'erreur' ne peut pas compiler avec/clr '. J'ai essayé d'inclure dans #pragma non géré/géré, mais cela ne semble pas fonctionner.

Y a-t-il quelque chose que je puisse faire sans modifier le code de la bibliothèque externe ou écrire des wrappers?

Répondre

1

Le code non géré ne peut pas être appelé directement dans .NET géré. Vous devez ajouter __declspec(dllexport) aux déclarations de vos fonctions qui devraient être visibles en dehors de la bibliothèque non gérée:

public: 
    void __declspec(dllexport) MyUnmanagedMethod(); 

Et puis dans votre code managé écrire un wrapper simple comme ceci:

public ref class Wrapper 
{ 
public: 
    [DllImport("MyUnmanagedLibrary.dll")] 
    static extern void MyUnmanagedMethod(); 
} 

Maintenant, vous pouvez appeler Wrapper.MyUnmanagedMethod comme toute autre méthode statique de votre code managé.

+0

si je n'avez pas le fichier .dll? Seul le groupe de fichiers .h et .cpp – spacevillain

+0

.dll est créé par le compilateur lorsque vous générez votre projet non géré. Recherchez-le dans votre répertoire Déboguer ou Libérer – NOtherDev

1

La solution générique consiste à encapsuler les appels de bibliothèque dans des fonctions/classes wrapper fines dont vous pouvez inclure dans le code managé des fichiers d'en-tête. Pas très joli mais vous y amènera.

0

P/Invoke avec l'attribut DLLImport vous demande également de vous méfier et de vous salir en plaçant les paramètres de la fonction, le cas échéant, dans les types CLR. Ainsi, par exemple un DWORD devient un int, IN HANDLE peut devenir un IntPtr, LPDWORD devient un out int, LPVOID peut généralement être classé comme byte[] ... et ainsi de suite. Voir un résumé décent à ce sujet here.

Un exemple tiré de mon récent projet où je devais l'interface avec une DLL pour une vieille boîte de sortie numérique:

//This function's header in the DLL was: 
//BOOL _stdcall fnPerformaxComSendRecv(IN HANDLE pHandle, IN LPVOID wBuffer, IN DWORD dwNumBytesToWrite, IN DWORD dwNumBytesToRead, OUT LPVOID rBuffer); 
[DllImport("PerformaxCom.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private static extern bool fnPerformaxComSendRecv(IntPtr pHandle, byte[] wBuffer, int dwNumBytesToWrite, int dwNumBytesToRead, byte[] rBuffer); 
+0

Comment passez-vous des objets de type complexe à une méthode P/Invoke? –