2012-04-12 86 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