2010-11-23 19 views
4

est-il possible d'appeler des méthodes C# écrites en code managé (peut-être dans une classe ou une bibliothèque) à partir d'un code c natif (et comment)?comment appeler les méthodes C# (mono, .net), les délégués natifs c

thx

modifier: avec « C# » Je me réfère principalement à mono ou même portable.net et le système d'exploitation est Linux

+0

double possible de [Comment exporter c méthodes de #?] (Http://stackoverflow.com/questions/2082159/how-to-export-c-methods) –

Répondre

6

Votre code C peut définir des fonctions pour enregistrer des rappels. Le code C# peut invoquer ces fonctions et transmettre les délégués gérés en tant qu'arguments. Le code de rassemblement les transformera de manière transparente en pointeurs de fonction C. Si vous l'approchez du côté C, vous pouvez également utiliser l'API d'intégration Mono pour charger des assemblages, rechercher des méthodes Mono et les appeler.

L'utilisation de l'API d'intégration est beaucoup plus compliquée. Si votre point d'entrée est en C, vous devrez utiliser l'API d'intégration, mais il est probablement plus facile d'écrire simplement une méthode gérée pour effectuer l'enregistrement des rappels et toute autre configuration gérée, il vous suffit de charger et d'invoquer cette seule méthode à partir du code C.

+0

Les points d'entrée seront parfois en assembleur C peut-être aussi. Eh bien, je vais essayer d'aller après ces instructions http://www.mono-project.com/Embedding_Mono. Si vous avez d'autres bons tutoriels, vous pouvez me le dire. – Gobliins

+0

Quand j'utilise le code C en mono, je vais habituellement pour dllimport. – Gobliins

2

Il y a un Overview of Managed/Unmanaged Code Interoperability sur le site MSDN qui pourrait jeter un peu de lumière pour vous. Un extrait ci-dessous:

Accéder directement à un API Managed

Si un client non géré est écrit dans C++, il peut être compilé avec le Visual Studio .NET compilateur C++ comme « mode mixte image." Après cela, le client non géré peut accéder directement à toute API gérée. Cependant, certaines règles de codage s'appliquent à accédant aux objets gérés à partir du code non géré ; consultez la documentation C++ pour plus de détails.

L'accès direct est l'option préférée car il ne nécessite aucune considération spéciale de la part des développeurs gérés API . Ils peuvent concevoir leur API gérée conformément aux directives de conception API ( ) et être en sachant que l'API sera toujours accessible aux appelants non gérés.

une API Managed Révéler comme une API COM

Chaque classe managée public peut être exposé aux clients non gérés par COM Interop. Ce processus est très facile à mettre en œuvre, car la couche COM interop prend soin de tous les plomberie COM . Ainsi, par exemple, chaque classe gérée semble implémenter IUnknown, IDispatch, ISupportErrorInfo et quelques autres interfaces COM standard .

Malgré le fait que l'exposition des API gérées comme API COM est facile, gérée et les modèles d'objet COM sont très différents. Par conséquent, l'exposition de l'API gérée à COM doit toujours être une décision de conception explicite . Certaines fonctionnalités disponibles dans le monde géré n'ont pas d'équivalent dans le monde COM et ne seront pas utilisables depuis les clients COM. En raison de cela, il existe souvent une tension entre des directives de conception d'API gérées (DG) et la compatibilité avec COM.

Si les clients COM sont importants, écrivez votre API gérée selon les directives de conception API gérées et ensuite écrire une mince enveloppe COM convivial géré autour de votre API géré seront exposés à COM.

une API Managed Révéler comme API Flat

ne peuvent pas utiliser COM clients parfois non gérés. Par exemple, ils peuvent déjà être écrits pour utiliser des API plates et ne peuvent pas être modifiés ou recompilés. C++ est le seul langage de haut niveau qui permet vous d'exposer les API managées comme API plates. Cela n'est pas aussi simple que d'exposer une API gérée en tant qu'AP API COM. C'est une technique très avancée qui nécessite une connaissance avancée de C++ interop et les différences entre les gérés et les mondes non gérés.

Exposez votre API managée en tant qu'API plate uniquement si cela est absolument nécessaire. Si vous avez n'avez pas le choix, assurez-vous de vérifier la documentation C++ et soyez pleinement conscient de toutes les limitations.

+0

C++/CLI fonctionne uniquement sous Windows, et la présence de la balise "mono" indique qu'un support multi-plateforme est probablement souhaitable. –

+0

Ne vous inquiétez pas, vous avez la réponse acceptée. – Lazarus