2010-05-07 51 views
4

我正在使用C#和VS2010。我有我在我的項目中引用的dll(作爲dll引用而不是項目引用)。該dll(a.dll)引用了另一個我的項目不直接使用的dll,我們稱之爲b.dll。這些都不在GAC中。在運行時滿足間接引用

我的項目編譯得很好,但是當我從Visual Studio運行它時,出現b.dll找不到的異常。當我的項目被編譯時,它不會被複制到bin目錄。

將b.dll放入bin目錄以便在運行時可以找到它的最佳方法是什麼? 我想到了四個選項。

  1. 使用後編譯步驟B.DLL複製到bin目錄
  2. B.DLL添加到我的項目(如一個文件),並指定複製到輸出目錄是否有更新的
  3. 添加B.DLL作爲一個DLL的參考我的項目。
  4. 使用ILMerge以B.DLL結合了A.DLL

我不喜歡3日所有的,因爲它使B.DLL看到我的項目,其他兩個看起來像黑客。我是否缺少其他解決方案?哪一種是「正確」的方式?依賴注入框架能夠解析並加載b.dll嗎?

回答

1

您可以將b.dll文件添加到您的項目並設置複製到輸出目錄。

如果b.dll已經在最終用戶的計算機上(某處),您可以處理AssemblyResolve event並自行加載。

如果你願意,你可以編譯爲您的項目中嵌入資源(添加文件,然後將生成操作嵌入的資源),然後加載它在AssemblyResolve處理)

編輯:例如:

static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { 
    if (args.Name == "b") 
     return Assembly.Load(path); 
} 
+0

我寧願我的項目,它不直接使用b.dll,不在其項目中有b.dll。 b.dll位於與引用a.dll相同的目錄中。 你能舉一個使用AssemblyResolve事件來處理這個事件的例子嗎? – automatic 2010-05-07 14:29:35

+0

終端用戶的機器上的'b.dll'在哪裏? – SLaks 2010-05-07 14:42:18

+0

在最終用戶機器上,我會確保它與exe文件位於同一個目錄中。我的問題更多的是關於發展。我有一個ReferencedDll目錄,保存a.dll和b.dll a.dll是從我的項目中的此目錄引用的。當我運行/調試我的項目b.dll沒有被加載,因爲它不在/ bin目錄中。 – automatic 2010-05-07 15:09:32