我目前正在学习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 ++应用程序公开公开方法。
答案 0 :(得分:6)
解决这个问题的一种方法是在C ++ CLI中编写一个包装器 - 这是c ++的一个版本,它被扩展为管理.net的东西。
您可以在C ++ cli中创建一个托管或“ref”类,它将显示为c#的普通.net类。
在c ++ cli类中,您可以正常调用纯c ++类。
答案 1 :(得分:2)
C#Interop允许您使用经典Win32 DLL公开的函数,就像它们是.NET方法一样。这些DLL通常用C语言编写。
您也可以用C ++编写Win32 DLL。它与在C中编写Win32 DLL的方式相同,唯一的区别是......
C ++编译器mangle函数名称,与C不同。名称修改将有关函数参数和返回类型的信息合并到函数名中,这就是使函数重载成为可能的原因。不幸的是,这意味着你的漂亮的函数名称,例如BlockAll
(也许是那些不那么漂亮的函数,如AddIPAddressToBlockedList
)会被转换为丑陋(或丑陋)的东西。您不想使用名称为?UnblockAll@@YAXXZ
的函数,是吗?
名称修改与编译器有关。因此,在C ++中编写Win32 DLL并不是一个好主意,除非您只使用从使用相同编译器的相同版本(在本例中为Microsoft的C ++编译器)编译的可执行文件(或其他DLL)中使用它。
如果您想简化生活,请使用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 ++代码,而无需编写特定于每种语言的代码。不好的是,它是构建过程中的另一个外部工具,它必须跟踪它自己的输入和输出。