编辑:
如果中间DLL是一个.NET程序集,您可以使用这里提到的方法,在调用任何使用中间DLL的方法之前指定查找中间DLL的位置,而无需更改现有代码。
然后,您不应该直接在C#项目中引用DLL,因为.NET程序集会在调用Main
方法之前被发现和加载。相反,您必须使用AppDomain
或其他方法动态加载中间DLL,然后通过反射或使用dynamic
对象来使用库。
显然,这会使编程变得非常繁琐。但是,有一种替代方法。您可以编写一个启动程序,加载您的原始应用程序(您可以将.exe文件作为库加载),并反射地调用您的原始程序的Main
方法。为了确保加载正确的中间DLL,您可以使用此处提到的方法,而您的启动程序正在加载您的原始应用程序。
以下讨论仍适用于硬件DLL。
如果满足以下条件,则以下内容有效:
- 您在应用程序运行期间仅需要一个版本的dll,并且
- 两个中间DLL版本具有完全相同的API。
根据MSDN,DLL搜索路径包括在PATH环境变量下指定的目录。(http://msdn.microsoft.com/en-us/library/7d83bc18%28v=vs.80%29.aspx) 因此,您可以将两个中间DLL版本放置在应用程序目录下的不同子目录中,但是每个目录下的名称必须完全相同,例如:
bin\
hardware-intermediate-v1\
intermediate.dll
hardware-intermediate-v2\
intermediate.dll
然后,在启动时,当您的应用程序确定要使用哪个版本后,您可以将上述目录之一添加到您的PATH环境变量中,
using System;
using System.Reflection;
using System.IO;
...
Environment.SetEnvironmentVariable(
"PATH",
Environment.GetEnvironmentVariable("PATH") + ";" +
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) +
"\\hardware-intermediate-v1"
);
然后,对P-Invoke方法(DLLImport)的调用将导致加载相应版本的DLL。要立即加载所有DLL,请参考DllImport,如何检查DLL是否已加载?。
但是,如果您希望在不重启应用程序的情况下同时使用两个版本的DLL,或者如果两个DLL之间在方法名称和/或参数计数/类型的级别存在任何API差异,则必须创建两组单独的P-Invoke方法,每个绑定到其对应的中间DLL版本。