編輯:
如果中間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