2012-07-10 30 views
0

我正在C#项目中工作,并且我没有C#经验。我们有一组使用C++编写的DLL,它们具有相同的类和相同的功能,但它们的工作方式不同。作为一个例子,让我们说我们的程序转换BMP文件。我们有用于将BMP转换为JPG,BMP转换为PNG等的DLL。我们用C#编写的程序应该以某种方式封装这些DLL,但不能以静态的方式进行封装。我们希望能够在运行时更改正在使用的DLL,并在需要时(也可以在运行时)添加新的DLL。就像插件一样,如果你愿意的话。在C#中使用在运行时确定的C++ DLL

你的建议是如何实施这种方法?

+0

这些DLL是否导出任何C++类,或者导出中只有PInvoke兼容函数? – Dennis 2012-07-10 05:38:44

+0

就目前为止我从代码中可以看到,它们只是PInvoke兼容的函数。 – hattenn 2012-07-10 05:43:38

回答

1

如果你不知道你所有的DLL文件都是提前设施,你可能需要调用Win32函数“LoadLibrary”“GetProcAddress”和“FreeLibrary”。据我所知,c#没有办法自动执行一种Dynamic PInvoke。有关更多信息,请参见this blog post

或者,您可以使用PInvoke为每个DLL创建一个C#封装,然后使用托管代理来调用函数。然后,通过更改委托,可以在运行时调用不同的函数(推测可能在不同的DLL中)。这取决于你在编译时有一个你打算使用的DLL的完整列表。尽管如此,它比第一个选项强大得多。让运行时为您处理所有编组也更容易一千倍。有关更多信息,请参见this MSDN article

0

你可以使用externDLLImport像微软,提供更多的细节Go hereHere

1

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