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

Using C++ DLLs determined during runtime in C#

本文关键字:C++DLL 运行时      更新时间:2023-10-16

我现在正在做一个C#项目,对C#没有任何经验。

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

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

你对实施这种方法有什么建议?

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

如果你不提前知道所有DLL都是什么,你可能需要调用Win32函数"LoadLibrary"GetProcAddress"answers"FreeLibrary"。据我所知,c#没有办法自动执行某种动态PInvoke。查看此博客文章了解更多信息

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

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

您可以使用微软提供的类似externDLLImport的设施。有关更多详细信息,请访问此处或此处