2010-01-28 5 views
1

J'apprends actuellement VC++. J'ai créé une application qui a des fonctionnalités pour bloquer/autoriser les adresses IP et je voudrais exposer cette fonctionnalité à une application C#.Comment exposer une méthode C++ à mon application C#?

J'ai défini les membres suivants dans mon fichier d'en-tête, méthodes de référence dans mon fichier .cpp (nu avec moi si c'est évident, comme c'est mon deuxième jour de C++) qui doivent être accessibles en dehors de mon application .

public: 

// Constructor. 
ZizFilter(); 

// Destructor. 
~ZizFilter(); 

BOOL StartFirewall(); 
BOOL StopFirewall(); 

BOOL AddIPAddressToBlockedList(char* IP) 
BOOL RemoveIPAddressFromBlockedList(char* IP) 

BOOL BlockAll(char* tunnelAddress); 
BOOL UnblockAll(); 

Je comprends le côté C# Interop et comment consommer des méthodes d'assemblage exposées, mais je ne sais pas comment mon application C++ pour exposer publiquement les méthodes.

+0

A en juger par l'interop-tag, vous n'utilisez pas VC++ CLI (ou quoi que ce soit, appelé, ce thing.NET hybride)? – Skurmedel

+1

J'utilise Microsoft Visual C++ et .NET –

+1

@Skurmedel, je pense que Peter voulait dire qu'il fait son travail .NET strictement en C#. @Peter: Il est possible d'écrire des applications .NET en C++. – pyon

Répondre

5

Une façon de gérer est d'écrire un wrapper en C++ CLI - c'est la version de C++ qui est étendu à faire des choses gérées .net.

Vous pouvez créer une gestion ou classe « ref » dans le cli de C qui apparaît comme une classe normale .net C#.

Dans la classe C++ cli, vous pouvez appeler votre classe C++ pure comme normale.

+0

Cela peut être une technique extrêmement efficace qui comporte l'avantage de ne jamais laisser COM dans l'image. J'ai utilisé C++/CLI * assez * efficacement comme couche entre un contrôle d'interface utilisateur MFC hérité et un nouveau frontal C# WinForms. J'ai enveloppé le contrôle MFC dans C++/CLI en tant que contrôle géré afin qu'il ressemble à tout autre objet géré au code C#. –

+0

A travaillé comme un charme. Merci! –

0

Vous devez placer vos méthodes dans une DLL (Dynamic Link Library). Si vous utilisez Visual Studio, vous devriez être en mesure de suivre l'assistant du nouveau projet win32 dll.

2

Ahem ... Clarifions certaines choses:

  1. C# Interop vous permet d'utiliser les fonctions exposées par classique DLLs Win32 comme si elles étaient des méthodes .NET. Ces DLL sont généralement écrits en C.

  2. Vous pouvez écrire des DLL Win32 en C++ ainsi. C'est exactement la même chose que d'écrire une DLL Win32 en C, avec la seule différence que ...

  3. Les compilateurs C++ mangle noms de fonctions, contrairement à C. Nom mangling intègre des informations sur le paramètre de fonction et les types de retour dans un nom de fonction, c'est ce qui rend la surcharge de fonction possible. Malheureusement, cela signifie que vos noms de belles fonctions tels que BlockAll (et peut-être les moins beaux comme AddIPAddressToBlockedList) sont convertis en choses laides (ou laides). Vous ne voulez pas utiliser une fonction dont le nom est [email protected]@YAXXZ, n'est-ce pas?

  4. La gestion des noms dépend du compilateur. Ainsi, l'écriture de DLL Win32 en C++ n'est pas une bonne idée sauf si vous allez l'utiliser uniquement à partir d'un exécutable (ou d'une autre DLL) compilé avec la même version du même compilateur (dans ce cas, le compilateur C++ de Microsoft).

Si vous voulez vous simplifier la vie, utilisez C et non C++ pour exporter des fonctions vers votre application .NET. C++ a une fonction géniale, extern "C" qui dit au compilateur de traiter votre code comme code C utiliser C linkage (pas mangling). Cela vous permet d'écrire des wrappers C autour de vos fonctions C++.

EDIT:

Une autre possibilité que j'ai oublié complètement est d'utiliser C++ Interop (oui, vous pouvez utiliser C++ pour écrire un wrapper .NET autour de votre Win32 DLL) et seulement ensuite utiliser C# pour appeler votre wrapper .NET . Attention cependant, puisque C++/CLI (l'extension de C++ pour permettre la sémantique spécifique à .NET) est très artificielle.

0

Une autre option consiste à utiliser Swig pour générer du code C# pour appeler vos fonctions C++. Cela suppose que vos fonctions C++ sont compilées dans une DLL, et que cela ne vous dérange pas d'avoir beaucoup de code wrapper supplémentaire. L'avantage de cet outil est que vous pouvez appeler le même code C++ à partir de plusieurs langues sans avoir à écrire du code spécifique à chaque langue. Le mauvais est que c'est un autre outil externe dans votre processus de construction avec ses propres entrées et sorties que vous devez suivre.

Questions connexes