2010-12-13 6 views
17

Est-ce que quelqu'un a travaillé sur l'appel d'un module C# à partir du module C. J'ai essayé de chercher sur internet mais je n'ai pas trouvé de bons exemples. Bien que beaucoup de sites disent quelque chose comme l'utilisation de COM interop mais n'ont pas pu trouver un exemple ou un article expliquant cela.Appel de C# à partir de C

Si quelqu'un peut me aider à ce sujet, ce serait génial

Merci, Sveerap

Répondre

16

Il n'y a pas que l'interopérabilité COM si vous souhaitez appeler du code managé à partir de C ou C++. Le sont également les suivantes méthodes moins connues (prises de MSDN FAQ):

Comment appeler un assembly .NET à partir de Visual C++ natif?

Il existe quatre méthodes pour appel assembly .NET à partir du code natif VC++:

  1. CLR API d'hébergement: module Native VC appelle CLR Hosting APIs à l'hôte CLR, charge et appeler l'ensemble de .NET (code d'échantillon: CppHostCLR).

  2. COM Interop: Si l'assembly .NET peut être exposé en tant que composant COM, le module de VC natif peut appeler dans l'ensemble de .NET dans .NET - COM Interop (code exemple: CppCOMClient).

  3. inverse PInvoke: Le code managé appelle code natif passer un délégué que le code natif peut rappeler (exemple de code: CSPInvokeDll).

  4. C++/CLI: Si le module contenant le code natif VC++ est autorisé à enable CLR, le code VC++ natif peut appeler assembly .NET directement (exemple de code: Consuming C# Library in native C or C++ using C++/CLI)

+0

Merci pour l'aide, je vais les regarder en détail et poster ma réponse – sveerap

+1

Merci, j'ai essayé le COM interop et je pourrais faire une sorte d'application hello world. – sveerap

+0

Les liens pour les API One Code et CLR Hosting sont rompus. Pouvez-vous fournir une mise à jour (je n'ai pas pu trouver les liens corrects) –

12

ici est une solution. La solution permet d'appeler une fonction C# de C en décorant votre fonction avec l'attribut [DllExport] (opposé de P/Invoke DllImport).

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

C# Code

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

code C

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

Comme @ iceflow19 commenté ci-dessous:

L'auteur du lien fournit un CLR IL préprocesseur comme un s ajouté tep pendant la compilation. Comme les assemblys utilisent le même format de conteneur binaire (DLL) sur Windows, si vous ajoutez manuellement les offsets de fonctions .Net dans IL à vtable (la liste des exportations de dll), Windows est assez intelligent pour appeler le CLR pour exécuter ce code lorsqu'il est appelé de C. Cependant, il y a des frais généraux. C'est une fonctionnalité non annoncée. C'est ainsi que fonctionnent les bibliothèques gérées mixtes en C++/CLI. Pour l'utiliser il suffit de l'ajouter à travers Nuget. La cible supplémentaire ajoutée dans votre fichier de projet MSBuild fournira l'étape de prétraitement IL

+4

J'ai lu ce lien, mais il n'avait pas vraiment d'exemple d'utilisation. Que devez-vous faire dans le projet c pour charger le code C# (dll?)? Avez-vous besoin de 'LoadLibrary'' FreeLibrary' etc. – weston

+1

L'auteur du lien fournit un préprocesseur CLR IL comme une étape supplémentaire lors de la compilation. Puisque les assemblages utilisent le même format de conteneur binaire (DLL) sur Windows, si vous ajoutez manuellement les décalages de fonctions .Net dans IL à vtable (liste d'exportations de dll), Windows est assez intelligent pour appeler le CLR pour exécuter ce code lorsqu'il est appelé de C. Cependant, il y a des frais généraux. C'est une caractéristique non annoncée. C'est ainsi que fonctionnent les bibliothèques gérées mixtes en C++/CLI. Pour l'utiliser, il suffit de l'ajouter via Nuget. La cible supplémentaire ajoutée dans votre fichier de projet MSBuild fournira l'étape de prétraitement IL. – iceflow19

+0

Je pense, votre commentaire est important d'ajouter dans le corps de la réponse. Merci pour cela. – MajesticRa

Questions connexes