Как я могу представить метод C ++ для моего приложения C #? - PullRequest
2 голосов
/ 28 января 2010

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

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

public:

// Constructor.
ZizFilter();

// Destructor.
~ZizFilter();

BOOL StartFirewall();
BOOL StopFirewall();

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

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

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

Ответы [ 4 ]

6 голосов
/ 28 января 2010

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

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

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

2 голосов
/ 28 января 2010

Гм ... Давайте уточним некоторые вещи:

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

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

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

  4. Перенос имени зависит от компилятора. Таким образом, написание Win32 DLL на 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 голосов
/ 28 января 2010

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

0 голосов
/ 28 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...