2010-04-27 7 views

Répondre

1

RE: Comment appeler du code managé C# à partir d'une application C++ non géré?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.interop/2005-05/msg00030.html

Calling managé .NET C# COM objets de code non géré C++ ...

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

Emballage d'un DLL géré C# dans un projet C++ non géré: dll.

http://www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

+0

J'ai suivi le deuxième lien que vous avez fourni et compiler avec succès le fichier cpp mais n'a pas réussi à l'exécuter. Il échoue à CreateInstance() en utilisant smartpointer ..... donc iam incapable d'appeler les fonctions de C# dll – user186246

+2

S'il vous plaît poster ici une solution ou au moins un résumé de celui-ci. Le lien peut se briser à l'avenir. Et il est aussi plus facile de lire toutes les solutions ici. Si elles sont plus d'une, vous pouvez les poster comme des réponses multiples. Merci! ;) – bluish

8

Ou utiliser un project of mine qui permet de créer C# exportations non gérés. Ceux-ci peuvent être consommés comme s'ils étaient écrits dans une langue maternelle.

+0

Salut, Cela semble très intéressant. Avez-vous une version pour VS 2010, ou pouvez-vous me signaler les changements à faire pour la rendre disponible pour VS 2010/Net 4? Merci – bzamfir

+0

Si cela fonctionne très bien (je l'utilise moi-même en 2010), vous voudrez peut-être changer le framework cible du projet nouvellement créé en 4.0. VS 2010 utilise par défaut .Net 2.0 lorsqu'aucun paramètre de structure cible n'est présent. –

+0

Merci, très bien. J'ai vu cela (j'ai créé un projet de test d'échantillon vide, mais pas testé si cela fonctionne encore) – bzamfir

5

J'ai d'abord utilisé COM interop, mais maintenant je suis passé à IJW (ça marche), car c'est beaucoup plus simple. J'ai une enveloppe C++/CLR DLL (compiler avec/clr).

Un exemple simple (en utilisant statics pour faire les appels plus facile):

namespace MyClasses  
{ 
    public class MyClass 
    { 
     public static void DoSomething() 
     { 
      MessageBox.Show("Hello World"); 
     } 
    } 
} 

Dans la DLL je peux faire référence à namespaces comme suit:

using namespace MyClasses; 

et l'appeler:

__declspec(dllexport) void CallManagedCode() 
{ 
    MyClass::DoSomething(); 
} 

Vous avez maintenant une exportation DLL non gérée "CallManagedCode" qui appelle dans le code managé.

Bien sûr, vous devez également convertir les données entre les limites gérées/non gérées. À partir de VS2008, Microsoft inclut un marshal-helper pour la conversion entre les types non gérés et gérés. Voir http://msdn.microsoft.com/en-us/library/bb384865.aspx

+0

Vous n'avez pas vraiment à descendre cette route manuellement. Consultez le lien dans ma réponse. Il est tout à fait possible d'avoir la contrepartie de DllImport en C#, y compris toutes les qualités de marshaling fournies avec .Net. Ma tâche MSBuild ajoute le vt-fixup approprié après la construction et vous n'avez pas besoin de déployer un autre assembly ... –

+0

Je l'ai essayé: La DLL a les exportations. Cependant, comment suis-je censé l'utiliser? Je n'ai pas trouvé de fichier .lib pour me permettre de créer un lien vers la DLL. –

+0

Je n'utilise pas C++, mais je suppose que ce n'est pas différent de ce que vous feriez pour une bibliothèque qui ne contient pas d'en-têtes C/C++: Écrivez l'en-tête pour les fonctions que vous voulez importer vous-même. Comme je l'ai dit, je n'utilise pas C++. C'est assez simple de C ou Delphi. –

2

J'ai utilisé les classes d'encapsulation C++/CLI described here et il était relativement facile à implémenter.

+2

S'il vous plaît poster ici une solution ou au moins un résumé de celui-ci. Le lien peut se briser à l'avenir. Et il est aussi plus facile de lire toutes les solutions ici. Si elles sont plus d'une, vous pouvez les poster comme des réponses multiples. Merci! ;) – bluish

Questions connexes