使用在C#中运行时确定的C++DLL
Using C++ DLLs determined during runtime in C#
我现在正在做一个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会导致运行时异常,而不会在发生更改时编译错误。
您可以使用微软提供的类似extern
和DLLImport
的设施。有关更多详细信息,请访问此处或此处
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 在运行时加载C++ DLL
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- MSVCP140.dll尽管设置了 /MT 运行时库
- 在程序运行时更改 DLL
- .NET CORE 2 DLL引用带有C 代码运行时错误
- C DLL通过C#UWP应用程序中的Win运行时组件适用于ARM,但对于X86/X64不适用于
- 如何在运行时构建DLL
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 在运行时用c++创建dll
- VBA 中的 Qt5 Dll,错误运行时错误 453
- 当应用程序在不同系统上运行时,无法加载DLL异常
- 如何在运行时像可执行文件一样"启动"DLL?
- 在VS中编译程序,无需外部运行时DLL
- 在运行时加载 DLL
- 如何在运行时链接期间从我的 DLL 调用函数
- 使用 DLL 运行时,按钮上不显示位图
- 当从DLL运行时,c++ cdialgex丢失ParentWnd
- MSVCR100D.dll运行时错误