Pour invoquer une API C à partir de C#, j'utiliserais P/Invoke. Mais si je devais faire l'inverse, appelez les API .NET de C, comment j'y arriverais?Appel d'API C# (.NET) à partir de C
Répondre
Si vous voulez vraiment tout faire à travers les API C et faire un tour en COM et C++, vous pouvez faire ce qui suit. Mais commencez par comprendre si c'est vraiment nécessaire! Je soupçonne que dans la plupart des cas ce ne sera pas le cas.
Étape 1. Créez l'assemblage C# .Net que vous souhaitez appeler. Étape 2. Créez un ensemble CLI/C++ en mode mixte avec les fonctions externes «C» exportées. Demandez à cet assembly d'appeler l'assembly C $.
Étape 3. Créez votre application C qui appelle les fonctions de style C exportées de la DLL faite à l'étape 2.
choses à considérer. A. Existe-t-il un BESOIN pour qu'une application C (par rapport à C++/COM) appelle directement un assemblage .Net? En d'autres termes, pourquoi ne pas utiliser les méthodes .NET exportées C++ et COM vers COM si vous devez vraiment avoir une application/un système mixte (.Net et non.Net)? B. Les API que vous écrivez seront-elles des wrappers sur les classes? Si oui, comment allez-vous gérer leurs temps de vie? (par exemple, créerez-vous/utiliserez-vous des poignées? Comment allez-vous gérer leurs relations avec les objets gc réels ... etc)
C. Cordes. Ceux-ci sont gérés très différents entre C et .Net. Assurez-vous de connaître leurs différences et d'envoyer correctement les chaînes à travers ces limites ... Astuce: CString est votre ami.
Vous pouvez transformer le code C# en COM ou utiliser C++ \ CLI.
Il existe une solution qui peut éviter d'utiliser COM ou C++ \ CLI. Voir ici: Calling A .NET Managed Method from Native Code
Voici une solution. Il met en œuvre [dllexport] attribut https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports
Alors on peut faire quelque chose comme ceci pour appeler le code managé de code non managé:
code C#
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;
}
- 1. Appel de C# à partir de C
- 2. Appel du service Web .Net à partir de l'objectif C
- 3. Appel d'une fonction Java à partir de C# .Net
- 4. Appel d'un objet COM à partir de .Net C#
- 5. Appel du composant pipeline BizTalk à partir de .NET C#
- 6. Appel d'objets COM C++ non gérés à partir de C#
- 7. Appel de MATLAB à partir de C
- 8. Appel de C# à partir de IronRuby
- 9. Appel de C# à partir de ColdFusion
- 10. Appel de la méthode C++ à partir de l'objectif C
- 11. Création d'une DLL C++ et appel à partir de C#
- 12. appel C++ java exe à partir
- 13. Appel d'une fonction C++ à partir d'un programme C
- 14. Lancer l'application C# .Net à partir de C++
- 15. Appel de service Web à partir de C++
- 16. Appel de la fonction JavaScript à partir de l'objectif c
- 17. Appel de fichier msi dans c à partir de CreateProcess
- 18. Appel de l'objet IronPython à partir de C# avec mono
- 19. Appel de scripts PowerShell à partir de C++
- 20. Appel de méthode d'objet C# à partir de IronPython
- 21. Appel de DLL C++ à partir de Python
- 22. Appel de la procédure stockée Oracle à partir de C#?
- 23. Incorporation de Ruby, appel d'une fonction à partir de C
- 24. Appel asynchrone C# .Net débutants question
- 25. Appel de l'application Borland C++ Builder à partir de ASP.NET/C#
- 26. Appel d'une méthode Web à partir de C++
- 27. Appel du service Web ASP.net à partir de l'application C#
- 28. Appel du service Web à partir de C++ v6
- 29. Appel d'un ancien composant OLE à partir de C#
- 30. Appel d'une fonction Oracle à partir de C#