繁体   English   中英

在运行时动态加载DLL

[英]Dynamically Loading DLLs at Runtime

我正在研究一个支持两个通信接口的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。 有一个优美的方法可以做到这一点吗?

P /调用“ LoadLibrary”怎么样?

在.NET 1.1中,您需要创建一个代理非托管DLL(用C或Delphi或...编写)并调用它的方法,其余的将由非托管DLL完成。 在.NET 2.0及更高版本中,请使用Assembly.LoadFile()及更高版本。 不像您尝试使用的声明那样优雅,并且需要大量的编码。 因此,我建议尽可能采用一种代理方式。

也许您应该给从这两个DLL导入的方法赋予不同的名称,然后在程序中有一个指向另一个或另一个的委托(以适当的为准),并仅调用该委托。

听起来最好将您重新构建到模块化插件样式接口。

像这样的Web上有十亿个这样的例子。 简而言之,您可以在DLL目录上使用LoadAssembly(),然后回退到通用基本接口。

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

C#检查文件目标是否有效

谢谢各位的意见!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM