2012-04-12 85 views
0

我有一个项目(称之为平台),它引用一个.NET的DLL(称之为仪器代理),引用使用的DllImport一个C++ DLL(称之为仪)。该仪器及其代理版本始终是相同的版本,并且始终部署为一个版本。引用一个.NET的DLL +非托管的DLL

我需要能够部署几台仪器(含股东代理人)在一台机器上,并且只有一个,使用仪器的特殊版本的平台。

好像我不能把一个insturent代理向海关总署,因为它采用的是C++ DLL。我可以安装一个仪器(和它的代理)到一个特定的文件夹,但我怎么能保证平台将发现的dll?

Upd。

理论上我想看到的想法是引用此dll,而正常发展,但能够使我的应用程序搜索自定义文件夹中的此dll。

回答

1

您可以将非托管dll文件复制到一个文件夹,然后将该文件夹添加到系统路径变量,或者您可以将这些文件复制到Windows \ System32,因为此文件夹始终在系统路径中。要修改系统路径,右击我的电脑 - >属性 - >高级系统设置 - >在高级选项卡 - >环境变量下,你需要找到路径变量,然后修改它以包含你的文件。

复制文件,以Windows \ System32或%SYSTEMROOT%(C:通常\ Windows)中很容易,虽然,但我会建议使用与Path变量修改

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); 
+0

是的,但我想避免使用反射。例如,为了能够投到YourClass我需要有一个对dll的引用。使用你的方法我承担不起,所以我需要对所有呼叫使用反射,这是非常非常沉重的,我决定需要避免/。 – Archeg 2012-04-12 09:56:21

+0

我已经添加了该问题的更新,理想情况下我需要什么 – Archeg 2012-04-12 09:59:56

+0

您是对的。我已经更改了代码,但是这些都是你所知道的。将考虑一个解决方案,但动态加载程序集,这是你最终。也许表现可以接受?值得一试。 – 2012-04-12 10:08:02

0

像Maceij如上所示,将您的仪器部署在单独的文件夹中但不是使用反射来加载/实例化仪器,而是查看MEF。

您的具体需求,可能需要另一种方式来做到这一点,但我让仪器代理[Export]的IInstrument工厂接口下面的方法:

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

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

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