2010-07-11 3 views
1

J'ai écrit mon programme en C++ et l'ai exporté en tant que DLL. J'ai une interface graphique C# WPF et je veux importer la DLL pour faire le traitement.Comment partager une classe dans une DLL Visual C++ avec C#?

Je suis très nouveau à C#. Comment puis-je utiliser la classe C++ en C#? Je sais que je ne peux pas utiliser le fichier .h.

Parce que j'ai utilisé des pointeurs en C++, en C# je ne pouvais pas utiliser de pointeurs. C'est pourquoi j'ai été confus. Comme en C++ j'ai utilisé char* au lieu de string, et je dois retourner double* pour une grande collection de données double, et des choses comme ça.

+1

Il serait utile que vous incluiez la signature de l'une des méthodes que vous souhaitez appeler à partir de C#. –

Répondre

4

Il y a plusieurs façons:

  1. Export the DLL functions et utiliser DllImportAttribute-P/Invoke dans la DLL.
  2. Si elle est une DLL COM, vous pouvez générer un Runtime Callable Wrapper via TLBIMP.exe
  3. Vous pouvez utiliser C++/CLI pour construire créer un assemblage .Net qui charge et appelle des méthodes sur la DLL native.

Pour répondre à vos préoccupations supplémentaires, oui, vous pouvez utiliser des pointeurs en C#. Si vous avez une fonction qui a un paramètre double*, vous pouvez déclarer que C# comme ceci:

[DllImport("Your.DLL")] 
private static extern unsafe void DoProcessing(double* data, int dataSize); 

Vous devez vous assurer que vous cochez la case « Autoriser code unsafe » dans l'onglet de construction du projet C#, et après cela, vous pouvez utiliser des pointeurs sur le contenu de votre coeur. Cependant, notez que si je fournis ici la signature du pointeur, puisque vous êtes manifestement à l'aise avec les pointeurs, il existe d'autres signatures qui pourraient être plus sûres à utiliser et ne nécessiteraient pas la compilation de C# code. Le placier standard dans le CLR se chargera de la conversion d'un pointeur vers un tableau C#, à condition que vous donnez un peu d'un indice si la longueur est nécessaire:

[DllImport("Your.DLL")] 
private static extern void DoProcessing(
     [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] data, 
     int dataSize); 

Cette charge le placier d'utiliser le paramètre à l'index 1 (le 2ème paramètre) comme la taille du tableau de doubles pointé par le 1er paramètre. Cela vous permet d'éviter les pointeurs en C# et d'utiliser des types CLI sécurisés. Cependant, si vous aimez les pointeurs, mon conseil est de simplement les utiliser - le C# sera plus facile pour vous que d'avoir à comprendre comment écrire la signature de la méthode sans eux.

Pour plus de détails sur P/Invoke, reportez-vous à cette documentation: http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx

2

Beaucoup dépend de la structure de votre C++ dll. Si vous n'avez qu'une poignée de fonctions, et qu'elles ne sont pas des fonctions membres d'une classe, alors vous pouvez en faire des fonctions "extern C" et utiliser la fonction P/Invoke dans .NET (parfois appelée DllImport à cause de l'attribut que vous utilisez) pour accéder aux fonctions de C#.

Questions connexes