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。
一個問題是,該事件不存在於緊湊框架中,另一個問題是,我需要在編譯時使用其中一個DLL。 – Tom 2010-07-01 16:41:41
對不起;我不知道我是如何錯過CF部分的。我相應地更新了我的答案。 – 2010-07-01 17:50:26