2009-06-11 11 views
7

J'ai créé une DLL en utilisant la ligne de commande (csc). Supposons que dll contienne la méthode Add (int, int). Maintenant, je veux utiliser cette fonction d'ajout dans vC++ ??Comment utiliser C# DLL dans vC++?

Comment faire?

Votre aide sera grandement appréciée.

Voici ce que je fais.

vcproj; pour ce projet, j'ai le clic droit et la section de l'éditeur de liens ajouter des dépendances supplémentaires. ajouté le chemin où dll réside.

main.cpp

using namespace Test 

void main() 

{ 

    demo d; 

    d.add(5,5); 

} 

espace de noms d'erreur test n'existe pas.

Comment résoudre ceci?

J'ai besoin d'utiliser cette dll comme dans le code non managé

Répondre

9

Votre assemblage C# a besoin de l'attribut ComVisible (parmi quelques autres).

[assembly: ComVisible(true)] 

Il y a a guide to doing this here.

+2

Si l'application C++ est gérée, alors c'est encore plus simple que cela, et vous pouvez éviter COM dans son ensemble. – Noldorin

+0

@Matthew Brindley J'ai fait ce qui est donné sur http://support.microsoft.com/kb/828736 mais je reçois une erreur de ne peut pas convertir de 'const _GUID' en 'const IISWebFrameworkDAAB :: DataAccessInterface' "Que dois-je faire ? – user1402643

8

Des forums MSDN Calling C# from unmanaged C++:

Qu'est-ce que vous voulez faire serait de compiler uniquement les fichiers sur lesquels vous souhaitez pour charger le code C#/clr puis appelez loin en C++/CLI. Le reste de votre application restera natif tandis que les fichiers cpp que vous compilez/clr seront mélangés natif et CLR. Vous devriez être capable de juste appeler dans votre bibliothèque C# en utilisant la syntaxe C++/CLI.

Une fois que vous lancez/clr sur la cl.exe ligne de commande pour un fichier, dans ce fichier , vous pouvez appeler un code managé que vous voulez, que il a été écrit en VB.net, C# ou C++/CLI. C'est de loin la façon la plus facile de faire ce que vous voulez faire (appelez le code C# depuis votre application C++ native), , bien qu'il ait ses limitations caveat et . En gros si "Il Just Works". En outre, il est plus rapide que p/invoque.

2

Ceci dépend fortement du type d'application C++ que vous construisez. Si vous créez un assembly C++/CLI, vous devez vous assurer que le projet a une référence à la DLL C#. Une fois que cela est fait, vous devriez être en mesure de taper le code comme assomption écrite, vous avez une définition de Démo comme ça. Si vous créez un projet C++ normal, non géré, vous devez utiliser COM interop pour accéder à l'assembly. Cela implique de faire le type de démonstration dans votre projet C# COMVisible et de l'enregistrer pour COM interop. Après quoi vous pouvez y accéder comme n'importe quel autre composant COM.

+0

J'ai suivi ce http://support.microsoft.com/kb/828736 tout va bien avant "Appelez le DLL managé du code C++ natif" mais quand j'ai essayé de créer un pointeur j'obtiens l'erreur suivante "erreur C2259 : 'IISWebFrameworkDAAB :: DataAccessInterface': impossible d'instancier la classe abstraite 1> en raison des membres suivants: 1> 'HRESULT IUnknown :: QueryInterface (const IID &, void **)': est abstrait "Que dois-je faire? – user1402643

+0

la raison de l'erreur est "Raison: impossible de convertir 'const _GUID' en 'const IISWebFrameworkDAAB :: DataAccessInterface'" Que dois-je faire? – user1402643

Questions connexes