编辑:
如果中间DLL是.NET程序集,您可以使用方法中提到here指定到哪里寻找你的中间DLL 之前,你调用使用中间DLL的任何方法,而不必更改现有的代码。
然后你不能直接引用你的C#项目中的DLL,因为在你的Main
方法被调用之前.Net程序集被发现和加载。相反,您必须使用AppDomain
或其他方法动态加载中间DLL,然后通过反射或使用dynamic
对象来使用该库。
显然,这会使编程非常繁琐。但是,还有一种替代方法。您可以编写一个启动程序,加载您的原始应用程序(您可以将.exe文件作为库加载),并反思地调用原始程序的Main
方法。为了确保加载正确的中间DLL,您可以使用here提到的方法,而您的启动程序正在加载您的原始应用程序。
以下讨论仍适用于硬件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-调用方法(dllimport的)将导致DLL的相应版本被加载。要立即加载所有的DLL,你可以参考DllImport, how to check if the DLL is loaded?。但是,如果您希望在不重新启动应用程序的情况下一起使用这两个DLL版本,或者在方法名称和/或参数计数/类型级别上的两个DLL之间存在任何API差异,则必须创建两个独立的P-Invoke方法集,每个方法都绑定到相应版本的中间DLL。
您首先需要能够确定您的目标硬件。你解决了吗? –
我可以通过下拉选择来实现 - 或者,理想情况下,通过加载一个DLL并扫描硬件,然后加载另一个DLL并扫描硬件..如果可能的话.. – Mark
中间DLL是本地DLL吗? – Dennis