我正在开发一个支持两个通信接口的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会很好。有没有一种优雅的方式来做到这一点?
答案 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)