簡體   English   中英

.NET中的程序集綁定問題

[英]Assembly binding problems in .NET

我正在編寫一個.NET庫,由於各種原因,該庫無法在GAC中注冊。 該dll(我們稱其為SDK.dll)取決於要加載的其他DLL。

當編寫使用此SDK.dll的程序時,我注意到我的程序無法加載拋出FileNotFoundException的dll。 發生這種情況的原因是,盡管我能夠找到引用的SDK.dll,但CLR無法加載其依賴項。

我找到解決問題的唯一方法是“復制本地” SDK.dll及其所有依賴項(由於部署問題而無法執行此操作),或者將程序編譯到與SDK.dll相同的目錄中

有沒有辦法告訴SDK.dll在哪里尋找其依賴項,而不管其位置在哪里? 也許SDK.dll.config文件可以提供幫助?

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

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;
}

回復:Snooganz

您可能打算使用“加載文件”而不是“加載”,如下所示:

Assembly theAssembly = Assembly.LoadFile(assemblyFullName);

Assembly.Load可能會使您陷入無限循環=)

要在GAC中注冊您的程序集,必須使用強名簽名。

如果依賴其他程序集,則應在GAC中進行。

Beowulf

您不能GAC SDK,但是您可以GAC依賴嗎?

另請閱讀此msdn關於程序集綁定的文章:

http://msdn.microsoft.com/zh-CN/library/efs781xb(VS.71).aspx

如果程序集是強命名的,則可以使用代碼庫,如果不是,則代碼庫必須是isntall的子目錄,這將無濟於事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM