使用在C#中运行时确定的C ++ DLL

时间:2012-07-10 05:28:19

标签: c# c++ dll wrapper

我目前正在开展C#项目,而且我对C#没有经验。

我们有一组用C ++编写的DLL,它们具有相同的类和相同的功能,但它们的工作方式不同。作为一个例子,假设我们的程序转换了BMP文件。我们有用于将BMP转换为JPG,BMP转换为PNG等的DLL。

我们用C#编写的程序应该以某种方式包装这些DLL,但不能以静态方式包装。我们希望能够在运行时更改正在使用的DLL,并在需要时添加新的DLL(也在运行时)。像插件一样,如果你愿意的话。

您建议采用这种方法的建议是什么?

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

如果你不知道你的所有DLL是什么,你可能需要调用Win32函数“LoadLibrary”“GetProcAddress”和“FreeLibrary”。据我所知,c#没有办法自动执行某种动态PInvoke。有关详细信息,请参阅this blog post

或者,您可以使用PInvoke为每个DLL创建一个C#包装器,然后使用托管代理来调用这些函数。然后,通过更改委托,您可以在运行时调用不同的函数(可能在不同的DLL中)。这取决于您是否有编译时要使用的DLL的完整列表。它比第一个选项更强大。让运行时为您处理所有编组操作也要容易一千倍。有关详细信息,请参阅this MSDN article

答案 2 :(得分:1)

如果它们已经在C ++中,我会选择用C ++编写托管程序集 这walkthrough可能是一个起点。特别是C ++人员不需要学习C#。
P / Invoke有点慢,但更深层次的问题是你的版本管理作为P / Invoke将导致运行时异常而不是编译错误以防万一变化。

答案 3 :(得分:0)

您可以使用Microsoft提供的externDLLImport类设施,详细信息Go hereHere