在运行时动态加载DLL

时间:2010-09-09 19:49:02

标签: c# dll error-handling dllimport

我正在开发一个支持两个通信接口的C#应用​​程序,每个接口都有自己的DLL支持。每个DLL包含相同的函数名称,但它们的实现略有不同,具体取决于支持的接口。实际上,用户通常只在其计算机上安装了一个DLL,而不是两者都安装。旧接口的DLL导入如下:

[DllImport("myOldDll.dll", 
           CharSet = CharSet.Auto, 
           CallingConvention = CallingConvention.StdCall)]
public static extern int MyFunc1( void );
public static extern int MyFunc2( void );
public static extern int MyFunc3( void );

这是尝试引入任何DLL的有效方法吗?

[DllImport("myOldDll.dll", 
       CharSet = CharSet.Auto, 
       CallingConvention = CallingConvention.StdCall)]
[DllImport("myNewDll.dll", 
       CharSet = CharSet.Auto, 
       CallingConvention = CallingConvention.StdCall)]
public static extern int MyFunc1( void );
public static extern int MyFunc2( void );
public static extern int MyFunc3( void );

理想情况下,我认为如果尝试加载第一个DLL失败,检测丢失的DLL并加载第二个DLL会很好。有没有一种优雅的方式来做到这一点?

5 个答案:

答案 0 :(得分:0)

如何对“LoadLibrary”进行P / Invoke?

答案 1 :(得分:0)

在.NET 1.1中,您需要创建一个代理非托管DLL(用C或Delphi编写或者......)并调用它的方法,而非托管DLL将完成剩下的工作。在.NET 2.0及更高版本中,您可以使用Assembly.LoadFile()。不像您尝试使用的声明那样优雅,并且需要大量编码。所以如果可能的话,我建议采用代理方式。

答案 2 :(得分:0)

也许您应该从任一DLL导入的方法使用不同的名称,然后在程序中指定一个委托,指向一个或另一个(以适当者为准),并且只调用委托。

答案 3 :(得分:0)

听起来您最好能够重新构建模块化插件样式界面。

网上有一十五个这样的例子like this one。简而言之,您在DLL目录上使用LoadAssembly(),然后转换回您的公共基接口。

答案 4 :(得分:0)

我认为我找到了一个可行的解决方案:

C# check that a file destination is valid

谢谢大家,感谢您的投入!