0

我有一个引用.net dll(称为仪器代理)的项目(称为平台),该项目使用 DllImport(称为仪器)引用 C++ dll。仪器和它的代理总是相同的版本并且总是作为一个部署。

我需要能够在一台机器上部署多个仪器(及其代理),并且只有一个使用特定版本仪器的平台。

似乎我无法将 insturent-proxy 放置到 GAC,因为它使用 C++ DLL。我可以将仪器(及其代理)安装到特定文件夹,但如何确保该平台能够找到该 dll?

更新。

理论上我希望看​​到的想法是在正常开发时引用这个 dll,但能够让我的应用程序在自定义文件夹中搜索这个 dll。

4

4 回答 4

2

将它们保存在单独的文件夹中会很好。您可以使用自己加载正确的仪器代理程序集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-12T09:13:24.587 回答
1

您可以将非托管 dll 文件复制到一个文件夹,然后将该文件夹添加到系统路径变量,或者您可以将这些文件复制到 Windows\System32 ,因为该文件夹始终位于系统路径中。

要修改系统路径,请右键单击我的计算机 -> 属性 -> 高级系统设置 -> 在高级选项卡 -> 环境变量下,您需要找到路径变量,然后修改它以包含您的文件。

将文件复制到 Windows\System32 或 %systemroot% (通常为 C:\Windows)更容易,但我建议使用修改路径变量的方法

于 2012-04-12T09:09:22.853 回答
1

对于 .Net 程序集,您可以订阅AppDomain.AssemblyResolve并在需要时使用 Assembly.LoadFrom 加载程序集(请参阅https://stackoverflow.com/a/10120664/143503)。

于 2012-04-12T10:11:16.053 回答
0

就像 Maceij 上面建议的那样,将您的仪器部署在单独的文件夹中。但是不要使用反射来加载/实例化仪器,而是看看 MEF。

您的确切需求可能需要另一种方法来执行此操作,但我会让仪器代理[Export]使用以下方法与 IInstrument 工厂接口:

IInstrument GetInstrument( string name, int major, int minor );

然后告诉 MEF 在哪里可以找到您的仪器,并让它创建不同的工厂,然后您可以从中请求您需要的仪器。

MEF 上的 MSDN:http: //msdn.microsoft.com/en-us/library/dd460648.aspx

于 2012-04-12T09:59:52.110 回答