如何向C#应用程序公开C ++方法?

时间:2010-01-28 17:31:20

标签: visual-c++ interop

我目前正在学习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#Interop方面以及如何使用公开的汇编方法,但我不知道如何让我的C ++应用程序公开公开方法。

4 个答案:

答案 0 :(得分:6)

解决这个问题的一种方法是在C ++ CLI中编写一个包装器 - 这是c ++的一个版本,它被扩展为管理.net的东西。

您可以在C ++ cli中创建一个托管或“ref”类,它将显示为c#的普通.net类。

在c ++ cli类中,您可以正常调用纯c ++类。

答案 1 :(得分:2)

嗯...让我们澄清一些事情:

  1. C#Interop允许您使用经典Win32 DLL公开的函数,就像它们是.NET方法一样。这些DLL通常用C语言编写。

  2. 您也可以用C ++编写Win32 DLL。它与在C中编写Win32 DLL的方式相同,唯一的区别是......

  3. C ++编译器mangle函数名称,与C不同。名称修改将有关函数参数和返回类型的信息合并到函数名中,这就是使函数重载成为可能的原因。不幸的是,这意味着你的漂亮的函数名称,例如BlockAll(也许是那些不那么漂亮的函数,如AddIPAddressToBlockedList)会被转换为丑陋(或丑陋)的东西。您不想使用名称为?UnblockAll@@YAXXZ的函数,是吗?

  4. 名称修改与编译器有关。因此,在C ++中编写Win32 DLL并不是一个好主意,除非您只使用从使用相同编译器的相同版本(在本例中为Microsoft的C ++编译器)编译的可执行文件(或其他DLL)中使用它。

  5. 如果您想简化生活,请使用C而不是C ++将函数导出到.NET应用程序。 C ++有一个很棒的功能,extern "C"告诉编译器将代码视为C代码使用C链接(不进行修改)。这允许您围绕C ++函数编写C包装器。

    编辑:

    我完全忘记的另一种可能性是使用C ++ Interop(是的,您可以使用C ++在Win32 DLL周围编写.NET包装器),然后使用C#调用.NET包装器。但是要注意你应该这样做,因为C ++ / CLI(C ++的扩展允许特定于.NET的语义)是非常设计的。

答案 2 :(得分:0)

您需要将方法放在dll(动态链接库)中。如果您使用的是Visual Studio,则应该只需按照win32 dll新项目向导进行操作即可。

答案 3 :(得分:0)

另一种选择是使用Swig生成c#代码来调用c ++函数。这假设您的c ++函数被编译成DLL,并且您不介意拥有大量额外的包装器代码。此工具的优点是您可以从多种语言调用相同的c ++代码,而无需编写特定于每种语言的代码。不好的是,它是构建过程中的另一个外部工具,它必须跟踪它自己的输入和输出。