Question

Je souhaite appeler mon code .NET à partir de C ++ non géré. Mon point d'entrée de processus est basé sur .NET, je n'ai donc pas à me soucier de l'hébergement du CLR. Je sais que cela peut être fait à l'aide des wrappers COM pour les objets .NET, mais j'aimerais accéder à des méthodes statiques individuelles de classes gérées. COM n'est donc pas mon itinéraire le plus court / le plus simple.

Merci!

Était-ce utile?

La solution

En supposant que vous parlez de vrai code non géré - pas seulement du C ++ natif fonctionnant dans un assemblage en mode mixte compilé avec / clr - le moyen le plus simple consiste à créer un wrapper pour votre code .NET en C ++ / CLI. Vous pouvez ensuite exporter les méthodes C ++ / CLI en les marquant simplement avec __declspec (dllexport).

Si vous avez le contrôle sur l'appel du code non managé, vous pouvez organiser les pointeurs de fonction sur vos méthodes .NET et les transmettre au code non managé.

Autres conseils

Regardez cette solution: https://sites.google.com/site/robertgiesecke/Home/uploads/ exportations non gérées La solution permet d’appeler la fonction C # de C en décorant votre fonction avec l’attribut [DllExport] (contrairement à P / Invoke DllImport).

Exemple:

code C #

class Test
{
     [DllExport("add", CallingConvention = CallingConvention.StdCall)]
     public static int Add(int left, int right)
     {
         return left + right;
     } 
}

Code C:

 extern "C" int add(int, int);

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }

Sortie:

The solution is found!!! Z is 15

Mise à jour : une question et une bonne réponse figurent dans les commentaires:

Comment inclure la DLL dans le projet non géré?

Vous devez créer un lien vers le fichier .lib généré lors de la compilation de votre code C # ( https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396 )

Consultez le GCHandle . class et le mot-clé gcroot, qui fournit un wrapper basé sur un masque de sécurité avec une typo autour de GCHandle.

Vous pouvez les utiliser pour conserver une référence à un objet CLR (ou une valeur encadrée) en code natif.

MSDN propose un didacticiel de base ici .

Je crois que vous recherchez Reverse PInvoke. Si vous recherchez Google pour inverser l'invocation, vous obtiendrez de nombreuses entrées utiles. Je pense que ce qui suit a un bon exemple rapide et sale.

PInvoke -Reverse PInvoke et __stdcall - __cdecl

Votre code d'appel est C ++ avec / clr activé. Droite?

Si oui, vous pouvez simplement utiliser l'instruction using pour utiliser votre DLL .NET dans votre code. Quelque chose comme:

#using <Mydll.dll>

et ensuite vous pouvez simplement créer les objets de vos classes gérées comme:

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

Si vous voulez faire de cet objet une donnée membre de votre classe, utilisez gcroot.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top