2008-12-10 91 views
3

我正在編寫一個.NET庫,由於各種原因無法在GAC中註冊。 這個DLL(我們稱之爲SDK.dll)依賴於其他DLL來加載。.NET中的程序集綁定問題

在編寫使用此SDK.dll的程序時,我注意到我的程序無法加載引發FileNotFoundException的dll。發生這種情況是因爲雖然我能夠找到引用的SDK.dll,但CLR未能加載它的依賴關係。

我發現解決問題的唯一方法是「複製本地」SDK.dll及其所有依賴項(我因爲部署問題而無法執行的操作),或將我的程序編譯到與SDK相同的目錄中.dll

有沒有辦法告訴SDK.dll在哪裏尋找它的依賴項,而不管它的位置?也許一個SDK.dll.config文件可以幫助?

回答

8

您可以通過訂閱此事件在運行時處理這個問題:

AppDomain.CurrentDomain.AssemblyResolve 

當運行時無法解析的組裝它的發射。在您的事件處理程序方法中,編寫您的邏輯來查找程序集並使用Assembly.LoadFrom()加載它。這將是這個樣子:

public SDKClass() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(FindAssembly); 
} 

private Assembly FindAssembly(object sender, ResolveEventArgs args) 
{ 
    string assemblyPath = "c:\PathToAssembly"; 
    string assemblyName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"; 
    string assemblyFullName = Path.Combine(assemblyPath, assemblyName); 

    Assembly theAssembly = Assembly.Load(assemblyFullName); 

    return theAssembly; 
} 
+0

比ks,我試圖做類似的事情。 – Epu 2011-08-26 20:34:40

0

要在GAC中註冊您的程序集,它必須使用strong name簽署。

如果它取決於其他程序集,那些應該在GAC中。

BeowulfOF

+0

問題是我不允許在GAC中註冊該DLL ... – Sakin 2008-12-10 15:47:59

0

回覆:Snooganz

你可能打算用裝載文件代替負荷的,就像這樣:

Assembly theAssembly = Assembly.LoadFile(assemblyFullName); 

Assembly.Load將可能讓你進入無限循環=)

+0

只要由「assemblyFullName」指向的程序集存在,就沒有無限循環。只有在程序集找不到時纔會觸發AssemblyResolve事件,因此在調用Assembly.Load(assemblyFullName)時不會再次觸發它。示例代碼只是爲了演示如何處理事件......您當然應該在適當的地方插入錯誤檢查(例如檢查程序集存在)。 – Snooganz 2010-01-20 05:12:07