2010-01-28 2 views
1

В настоящее время я изучаю VC++. Я создал приложение, которое имеет функциональные возможности для блокировки/разрешения IP-адресов, и я хотел бы предоставить эту функцию для приложения C#.Как открыть метод C++ для моего приложения C#?

Я определил следующие элементы в моем файле заголовка, который эталонные методы в моем файле .cpp (голые со мной, если это очевидно, так как это мой второй день C++), которые должны быть доступны за пределами моего приложения ,

public: 

// Constructor. 
ZizFilter(); 

// Destructor. 
~ZizFilter(); 

BOOL StartFirewall(); 
BOOL StopFirewall(); 

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

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

Я понимаю сторону C# Interop и как потреблять открытые методы сборки, но я не знаю, как получить мой C++ приложений публично разоблачать методы.

+0

Судя по interop-тегу, вы не используете VC++ CLI (или что-то еще, называемое гибридной .NET thingie)? – Skurmedel

+1

Я использую Microsoft Visual C++ и .NET –

+1

@Skurmedel, я думаю, что Питер имел в виду, что он делает свою работу .NET строго на C#. @Peter: Возможно писать .NET-приложения на C++. – pyon

ответ

5

Один из способов справиться с этим - написать обертку в C++ CLI - это версия C++, которая расширяется, чтобы делать управляемые .net вещи.

Вы можете создать управляемый или «ref» класс в C++ cli, который будет выглядеть как обычный .net-класс для C#.

В классе cli C++ вы можете назвать свой чистый класс C++ нормальным.

+0

Это может быть чрезвычайно эффективная техника, которая несет в себе преимущество, заключающееся в том, чтобы никогда не позволять СОМ в картину. Я использовал C++/CLI * довольно эффективно в качестве слоя между устаревшим элементом управления MFC UI и новым интерфейсом C# WinForms. Я завернул элемент управления MFC в C++/CLI как управляемый элемент управления, чтобы он выглядел как любой другой управляемый объект для кода C#. –

+0

Работал как шарм. Благодаря! –

0

Вам необходимо поместить свои методы в dll (Dynamic Link Library). Если вы используете Visual Studio, вы сможете просто выполнить мастер создания нового проекта win32 dll.

2

Гм ... Давайте прояснить некоторые вещи:

  1. C# Interop позволяет использовать функции, предоставляемые классической Win32 DLL, как если бы они были .NET методы. Эти DLL обычно пишутся на C.

  2. Вы также можете написать DLL Win32 на C++. Это то же самое, что писать DLL Win32 в C, с той лишь разницей, что ...

  3. C++ компиляторы mangle имена функций, в отличие от C. Название mangling включает информацию о параметре функции и типах возвращаемых значений в имя функции, это то, что делает возможной перегрузку функций. К сожалению, это означает, что ваши красивые имена функций, такие как BlockAll (и, возможно, не такие красивые, как AddIPAddressToBlockedList), преобразуются в уродливые (или уродливые) вещи. Вы не хотите использовать функцию, имя которой [email protected]@YAXXZ, не так ли?

  4. Название mangling зависит от компилятора. Таким образом, писать DLL-файлы Win32 на C++ - это не очень хорошая идея, если вы не собираетесь использовать ее только из исполняемого файла (или другой DLL), скомпилированного с той же версией одного и того же компилятора (в данном случае компилятора Microsoft C++).

Если вы хотите сделать свою жизнь простой, используйте C, а не C++ для экспорта функций в свое .NET-приложение. У C++ есть замечательная функция, extern "C", которая сообщает компилятору обрабатывать ваш код как код C использовать C-ссылку (без переключения). Это позволяет писать C-обертки вокруг ваших функций C++.

EDIT:

Другая возможность, что я совершенно забыл, чтобы использовать C++ Interop (да, вы можете использовать C++ для написания .NET обертку вокруг вашего Win32 DLL) и только затем использовать C# для вызова .NET обертку , Остерегайтесь, однако, потому что C++/CLI (расширение C++ для .NET-специфической семантики) - это очень.

0

Другой вариант - использовать Swig для генерации кода C# для вызова ваших функций C++. Это предполагает, что ваши функции C++ скомпилированы в DLL и что вы не против иметь много дополнительного кода оболочки. Преимущество этого инструмента заключается в том, что вы можете вызывать тот же код C++ с нескольких языков, не имея необходимости писать код, специфичный для каждого языка. Плохо то, что это еще один внешний инструмент в вашем процессе сборки с его собственными входами и выводами, которые вы должны отслеживать.

Смежные вопросы