Dot-Net

除非在程式碼中引用,否則通過添加引用添加的程序集不會復製到輸出目錄

  • January 2, 2012

情況:

  • 項目 1 是解決方案中的一個程序集
  • 項目 2 是同一解決方案中的可執行程序集項目
  • 項目 2 對項目 1 有一個項目引用(通過添加引用)
  • 項目 2 在程式碼中沒有直接引用項目 1 中的命名空間/類型
  • Project 2 使用 Ninject 動態載入 Project 1 並使用其中的實現類

問題:

  • 即使將引用的 Copy Local 設置為 True,並且 GAC 中不存在引用的程序集,也不會將引用的程序集複製到輸出建構目錄
  • Ninject 隨後找不到程序集,因此綁定/解析失敗

此過程適用於直接引用引用程序集中的某些類以及由 Ninject 載入的相同設置,因此我認為原因如下:如果 VS 檢測到程式碼中沒有引用引用程序集中的類型,它不會複製引用的程序集,即使它是使用 Copy Local = True 作為引用添加的。

解決方案:

  • 找到一種告訴 VS 的方法,“複製本地(我是認真的)”= True——這將是我理想的解決方案。
  • 添加對被引用程序集的文件引用。不太好,因為我失去了項目參考的優勢(這可能完全在我的腦海中,也可能不完全在我的腦海中)。
  • 在程式碼中以某種“令牌”方式引用程序集。凌亂 - 我想使用參考列表來維護我想要包含的程序集/模組的列表。
  • 複製程序集的建構後步驟。凌亂,不理想。

任何人都可以幫助解決第一個解決方案,或建議另一個解決方案嗎?

啊哈.. 引用的程序集以 .NET Framework 4.0 為目標,但引用程序集的目標是 .NET 4.0 的客戶端配置文件版本。

引用已添加、出現,根本沒有問題或警告(至少來自 UI 或 VS),但我無法在程式碼中引用它,它也不會出現在輸出中。

如果有人知道為什麼這沒有被發現,也許他們可以讓我知道?

如果您部署/複製包含對在 GAC 中註冊的自定義組件的引用的應用程序,則無論“複製本地”設置如何,該組件都不會隨應用程序一起部署/複製。見 MSDN

您必須通過將私有元數據添加到 GAC 程序集引用來強制將本地複制為 true 。編輯您的項目文件並添加私有元數據:

<Reference ..>
   <Private>True</Private>
</Reference ..>

<ProjectReference ..>
   <Private>True</Private>
</ProjectReference ..>

現在應該從輸出文件夾中複製/刪除您的 GAC 程序集。

引用自:https://stackoverflow.com/questions/8670744