2010-07-01 62 views
0

我目前正在使用DotNetZip讀取ZIP文件的.NET Compact Framework項目。該項目分爲兩部分。一個獨立於平臺的庫應該可用於CF項目和桌面項目。這個通用庫包含了解壓ZIP文件的代碼。問題是DotNetZip庫有兩個不同的DLL,一個用於.NET CF,另一個用於.NET桌面框架。無法在Desktop Framework上使用CF版本的庫,反之亦然,但它們共享相同的接口。在運行時選擇合適的平臺依賴DLL

如何在Visual Studio中組織我的項目,以便能夠使用常用的zip代碼並動態加載適當的DLL(然後由zip代碼使用)?還應該可以在PC上執行CF應用程序,以便在運行時選擇DLL嗎?

回答

1

UPDATE:

甲技術上不支持的,但工作溶液是P /調用LoadLibrary和特別是在過程的早期加載正確的DLL。所有託管和p/Invoke的庫都會根據需要加載。當您調用一個依賴於該程序集中某一類型的方法時,CLR會爲您加載它們(注意:這是「不受支持」的部分;這是而不是記錄的,可能會在未來的CLR版本中進行更改)。

該方法的工作原理是因爲如果程序集通過LoadLibrary加載,它由CLR加載程序「找到」,並且運行時不會再嘗試加載它。我們在CF上使用這個技巧來在進行大量內存分配之前預先加載程序集以避免內存不足的情況。

所以,你應該能夠做到:

public static void Main() 
{ 
    LoadCorrectDLLs(); 

    // .NET will ensure DotNetZip is loaded at this point. 
    MethodInThisAssembly(); 
} 

public static void MethodInThisAssembly() 
{ 
    // Since MethodInThisAssembly uses DotNetZip, 
    // its assembly will get loaded immediately before this method is called. 
    IDotNetZipInterface x = null; 
    ... 
} 

public static void LoadCorrectDLLs() 
{ 
    // p/Invoke LoadLibrary to load the correct version of DotNetZip. 
} 

請注意,以下將工作:

public static void Main() 
{ 
    LoadCorrectDLLs(); 

    // This line would force DotNetZip to get loaded before Main() is called 
    IDotNetZipInterface x = null; 
} 

舊的答案;只適用於桌面框架:

一個竅門是將它們放在DLL加載期間不會找到的目錄中(例如,可執行文件目錄的不同子目錄)並處理AppDomain.AssemblyResove。大衛莫頓有一個體面的寫作on his blog

+0

一個問題是,該事件不存在於緊湊框架中,另一個問題是,我需要在編譯時使用其中一個DLL。 – Tom 2010-07-01 16:41:41

+0

對不起;我不知道我是如何錯過CF部分的。我相應地更新了我的答案。 – 2010-07-01 17:50:26