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.