2 votes

Créer un objet standard .Net à partir de C++

En raison de dépendances logicielles tierces, que je ne peux pas détailler, nous devons pouvoir créer un objet de classe standard DotNet écrit en C# à partir d'un projet C++ compilé. sans le drapeau /clr et invoquer des méthodes sur cet objet. Est-ce possible ?

Pour être clair, le standard DotNet est un assemblage séparé qui possède des objets et des méthodes à invoquer à partir de DLL VC++ compilées sans le drapeau /clr. Fondamentalement, nous devons déployer les assemblages sur des machines qui Ne le fais pas. ont les Runtimes complets de DotNet Framework, mais auront DotNet Core/Standard SDK installé (ou seront déployés en tant que déploiement autonome ).

Ne répondez pas par "essayez ceci", sauf si vous savez que l'approche interop fonctionne réellement dans le scénario ci-dessus.

2voto

Ben Voigt Points 151460

Il existe de nombreux moyens d'interopérer avec .NET à partir de C++, dont certains ne nécessitent pas d'avoir recours à l'option /clr . Cependant, aucun d'entre eux ne permettra d'éviter

nous devons déployer les assemblages sur des machines qui ne disposent pas de la version complète de DotNet Framework Runtimes.

Si vous avez un assemblage contenant MSIL, vous devez installer .NET Framework (au moins le profil client). En effet, ces assemblages ne contiennent pas de code exécutable, mais uniquement une description portable qui sert d'entrée au compilateur Just-in-Time (JIT) du runtime .NET.


Il existe quelques chaînes d'outils qui peuvent compiler du C# vers du code natif, avec des niveaux variables de support d'exécution requis, mais aucune qui puisse être considérée comme étant de "qualité production" lorsqu'on travaille avec des bibliothèques .NET Framework arbitraires. (" .NET Native " fonctionnerait pour les bibliothèques destinées à WinRT). Et il y a des limites importantes au code que ces outils peuvent traiter (par exemple, la réflexion est sévèrement limitée, seulement l'introspection, pas de génération de code d'exécution ou même de composition de types). Ces limites s'appliqueraient non seulement à votre code mais aussi à toutes vos dépendances.


Si vous déployez la version de .NET requise par votre assemblage (Note : la question a été modifiée pour dire .NET Core, au lieu de simplement "ne pas avoir .NET"), alors vous pouvez utiliser l'API d'hébergement qui dit "ce tutoriel couvrira la construction d'une application C++ pour héberger .NET Core".

Au cours de ce processus, vous établirez des liens dynamiques ( GetProcAddress ) des fonctions telles que coreclr_initialize , coreclr_execute_assembly et coreclr_create_delegate . Ce dernier est décrit comme "Crée un pointeur de fonction vers une méthode gérée".

Il semble que cette API ne prenne pas en charge l'appel des constructeurs, car les concepteurs ont considéré qu'il était trivial d'écrire une fonction de fabrique comme une méthode statique, ce qui coreclr_create_delegate soutient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X