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

C# 使用C++;在C中运行时确定的DLL#,c#,c++,dll,wrapper,C#,C++,Dll,Wrapper,我目前正在做一个C#项目,我对C#没有任何经验 我们有一套用C++编写的DLL,它们具有相同的类和相同的功能,但是它们的工作方式不同。例如,我们的程序转换BMP文件。我们有用于将BMP转换为JPG、BMP转换为PNG等的DLL 我们用C语言编写的程序应该以某种方式包装这些DLL,但不能以静态方式。我们希望能够在运行时更改正在使用的DLL,并在需要时(也在运行时)添加新的DLL。就像插件一样,如果你愿意的话 您的建议是如何实施此方法?您可以使用Microsoft提供的类似extern和DLLImp

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

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

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


您的建议是如何实施此方法?

您可以使用Microsoft提供的类似
extern
DLLImport
的设施了解更多详细信息,或者您可以使用Microsoft提供的类似
extern
DLLImport
的设施,有关更多详细信息,或者如果您不知道所有DLL都是什么,您可能需要调用Win32函数“LoadLibrary”、“GetProcAddress”和“FreeLibrary”。据我所知,c#无法自动执行某种动态PInvoke。有关更多信息,请参阅


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

如果您不知道所有DLL都是什么,则可能需要调用Win32函数“LoadLibrary”、“GetProcAddress”和“FreeLibrary”。据我所知,c#无法自动执行某种动态PInvoke。有关更多信息,请参阅


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

这看起来不错:

看起来不错:

如果它们已经在C++中,我会选择在C++中编写托管程序集。
这可能是一个起点。特别是C++的人不需要学习C语言。BR>P/Unjk有点慢,但是更深层次的问题是,版本管理作为P/Unjk会导致运行时异常,并且在发生变化时不会编译错误。

< P>如果它们已经在C++中,我会选择用C++编写托管程序集。
这可能是一个起点。特别是C++的人不需要学习C++,BR>P/Unjk有点慢,但是更深层次的问题是,版本管理作为P/Unjk会导致运行时异常,并且在发生变化时不会编译错误。还是在出口中只有pUnKEY兼容函数?到目前为止,我从代码中可以看到,它们只是PNUKE兼容的函数。这些DLL是否导出了任何C++类,或者在导出中只有pJoKe-兼容函数?