Comment dois-je appeler C++/CLI à partir de C#?
J'ai une classe implémentée en C++, qui est responsable pour le calcul numérique du programme et d'une interface à l'aide de WPF. J'processus de l'entrée avec C# mais alors, comment puis-je utiliser ma classe C++?
J'ai vu quelques commentaires au sujet de faire un wrapper C++ managé classe d'interagir avec elle, mais je ne sais pas par où commencer. Je ne sais pas comment je vais compiler le long avec tous le autre code. Je ne peux pas vraiment trouver un tutoriel sur le présent, et le truc de google montre sur le C++ ne semble pas vraiment utile.
Quelque chose pour m'aider? Cela ne semble pas déraisonnable de moi.
MODIFIER Essayé m3rLinEz solution, mais c'est de me donner un BadImageFormatException, je pense que c'est parce que la DLL n'est pas générée. J'ai tout fait comme dit, je ne sais pas ce qui s'est passé. Des idées?
- Il y a un tutoriel décent ici: codeproject.com/KB/mcpp/quickcppcli.aspx#A8
- Je comprends que natice C++ est plus rapide que C#/WPF, mais qu'est-ce que les frais généraux de l'écriture d'un CLI wrapper autour de votre natif C++? Est tout ce travail en vaut vraiment la peine? Est le C++, enveloppé dans de la CLI de plus rapide que de porter simplement le code C++?
- Je fixe mon BadImageFormatException parce que mon CLI projet par défaut pour compiler en x86 mode et de mon application en C# a été dans n'Importe quel CPU mode. Le changement que ce soit, il peut travailler pour vous.
Vous devez vous connecter pour publier un commentaire.
Avez-vous de prendre un coup d'oeil sur le C++/CLI?
Laissez-moi vous donner un bref exemple. Voici le fichier source à partir d'un Visual C++ -> CLR -> projet de Bibliothèque de classes. Il fondamentalement obtenir un nom d'utilisateur Windows et le retourner.
Veuillez noter que, afin d'obtenir cette compilé, vous devez aller dans les paramètres de projet et de la marque "Dépendances Supplémentaires" comme "Hérite de l'objet parent" parce que nous sommes à l'aide de ces Fenêtres libs (kernel32.lib, user32.lib, ..)
De créer un nouveau projet C# et ajouter une référence à notre première C++/CLI projet de Bibliothèque de classes. Et puis d'appeler la méthode d'instance.
Cela a donné le résultat suivant sur ma machine:
C++/CLI est essentiellement géré extension de C++ standard. Il vous permet d'utiliser des classes CLR et les types de données en C++/CLI projet et de faire connaître ce langage managé. Vous pouvez créé un wrapper géré pour votre ancien de la bibliothèque C++ à l'aide de ce. Il y a quelques bizarre syntaxes
String^
pour définir le type de référence à CLR Chaîne. Je trouve "Rapide C++/CLI - Apprendre le C++/CLI en moins de 10 minutes" être utile ici.Il y a au moins trois façons d'appeler du code non managé de gérer dans le même processus:
Au travail, nous utilisons C++/CLI pour cela, il semble fonctionner.
Je voudrais créer un standard (non COM/Géré) Bibliothèque de liens Dynamiques comme décrit ici et ensuite utiliser le Attribut DllImport (platform invoke) dans le code c# pour accéder aux fonctions exportées.
Le point clé de cet article:
C'est un poids léger alternative à une réelle interopérabilité COM wrapper et évite les problèmes tels que l'inscription, etc (la DLL peut simplement être placé dans le répertoire de l'application)
.
Une autre alternative est Il Fonctionne, Tout Simplement (IJW). C'est probablement un meilleur choix si vous avez réussi à du code C++ et de la nécessité d'y accéder à partir d'autres .NET languages. Mais ce n'est qu'une option si vous êtes en mesure/heureux pour convertir votre le C++ pour le C++ si.
Je voudrais rester à l'écart de P/Invoke que c'est assez lent par rapport à IJW (Il Fonctionne, tout Simplement). Ce dernier vous permet facilement d'associer gérés et non gérés et non c++. Tout ce que vous avez à faire est de créer un managed c++ assemblée, écrire une classe managée qui est visible à partir de c# et de l'appeler le code non managé de cela.
Euh... OK. J'étais sous l'impression que P/Invoke appels ont été plus lents qui ils sont inherintly pas. Cependant, en ayant un contrôle explicite sur la composition des trains, vous pouvez rendre votre C++/CLI version de mieux performer dans un grand nombre de cas.
Ici est Microsoft article sur deux mécanismes:
http://msdn.microsoft.com/en-us/library/ms235282.aspx
Il y a des avantages esthétiques ainsi:
Vous n'avez pas à définir
DLLImport
attribut, vous n'avez pas besoin de définir des structures de données (avec un p/invoke attributs spécifiques) qui pourrait ressembler à ceci:[StructLayout(LayoutKind.Séquentielle, CharSet = Jeu De Caractères.Ansi)]
public structure DevMode
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
}
Marshal.PtrToString(ptr)
.À mon humble avis, si vous appelez une fonction bizarre dans le SDK de Windows, allez-y avec P/Invoke. Si vous êtes exposant un modérément complexes API C++ pour la gestion du monde, certainement le C++/CLI.