0

我目前正在做一个 C# 项目,我对 C# 的经验为零。

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

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

您对实施这种方法有何建议?

4

4 回答 4

2

这看起来不错:http: //blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

于 2012-07-10T05:42:19.447 回答
1

如果它们已经在 C++ 中,我会选择用 C++ 编写托管程序集。
演练可能是一个起点。尤其是 C++ 的家伙不需要学习 C#。
P/Invoke 有点慢,但更深层次的问题是版本管理,因为 P/Invoke 将导致运行时异常,并且在发生更改时不会编译错误。

于 2012-07-10T05:50:11.337 回答
1

如果您事先不知道所有 DLL 是什么,您可能需要调用 Win32 函数“LoadLibrary”“GetProcAddress”和“FreeLibrary”。据我所知,c# 没有办法自动执行某种动态 PInvoke。有关更多信息,请参阅此博客文章

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

于 2012-07-10T05:38:44.980 回答
0

你可以使用externDLLImport喜欢微软提供的设施,更多细节去这里这里

于 2012-07-10T05:37:03.577 回答