我有一个项目(称为平台),它引用一个.net dll (称为call proxy),该项目使用DllImport (称为仪器)引用C++ dll。仪器和它的代理总是相同的版本,并且总是作为一个整体来部署。
我需要能够在一台机器上部署多个仪器(及其代理),而只有一个平台使用该仪器的特定版本。
似乎我无法将一个实例代理放置到GAC,因为它使用C++ DLL。我可以将一个仪器(和它的代理)安装到一个特定的文件夹中,但是我如何确保这个平台能够找到那个dll呢?
Upd.
理论上我希望看到的想法是,在开发时引用这个dll作为正常,但是能够让我的应用程序在自定义文件夹中搜索这个dll。
发布于 2012-04-12 10:11:16
对于.Net程序集,您可以订阅AppDomain.AssemblyResolve并在需要时使用Assembly.LoadFrom加载程序集(参见https://stackoverflow.com/a/10120664/143503)。
发布于 2012-04-12 09:13:24
将它们保存在单独的文件夹中是可以的。您将使用Assembly.LoadFrom加载正确的工具-代理程序集。然后使用反射从该程序集创建类的实例并进行调用:
Assembly assm = Assembly.LoadFrom("c:\\Versions\\Version01\\instrument-proxy.dll");
Type yourClassType = assm.GetType("YourClass");
object yourClassObj = Activator.CreateInstance(yourClassType);
object Result = yourClassType.InvokeMember("DoSomething",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
yourClassObj,
args);为了避免反射调用InvokeMember,您可以尝试使用接口:
Assembly assm = Assembly.LoadFrom("c:\\Versions\\Version01\\instrument-proxy.dll");
Type yourClassType = assm.GetType("YourClass");
YourInterface interf = (YourInterface)Activator.CreateInstance(yourClassType);
interf.DoSomething();接口需要在一个独立的程序集中,您可以从platform中引用该程序集。所有instrument-proxies都必须针对同一版本的接口程序集进行编译。
如果您的设备代理找不到非托管Instrument.dll,您可以在第一次使用之前显式地加载它:
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
IntPtr pDll = LoadLibrary(@"PathTo_Instrument.dll");完成后释放/卸载:
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);发布于 2012-04-12 09:09:22
可以将非托管dll文件复制到文件夹中,然后将该文件夹添加到系统路径变量中,也可以将这些文件复制到Windows\ System 32,因为该文件夹始终位于系统路径中。
若要修改系统路径,请右键单击“我的计算机的属性”“预置系统设置”下的“预置”选项卡“环境变量”下的“系统设置”,您需要找到路径变量,然后修改该变量以包含您的文件。
但是,将文件复制到Windows\System32 32或%systemroot% (C:\Windows通常比较容易),但我建议使用路径变量修改的方法
https://stackoverflow.com/questions/10120118
复制相似问题