亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果在解決方案中使用項目依賴項,MSBuild不復制引用(DLL文件)

如果在解決方案中使用項目依賴項,MSBuild不復制引用(DLL文件)

如果在解決方案中使用項目依賴項,MSBuild不復制引用(DLL文件)我的VisualStudio解決方案中有四個項目(每個項目都針對.NET 3.5)-對于我的問題,只有這兩個項目很重要:MyBaseProject <- this class library references a third-party DLL file (elmah.dll)MyWebProject 1 <- this web application project has a reference to MyBaseProject我添加了elmah.dll引用MyBaseProject在VisualStudio 2008中,單擊“AddReference.”→“Browse”選項卡→,選擇“elmah.dll”。Elmah引用的屬性如下:別名-全局復制本地-真文化-描述-用于ASP.NET的錯誤日志記錄模塊和處理程序(ELMAH)文件類型-程序集路徑-D:\webs\otherfolder\_myPath\__tools\elmah\Elmah.dll解決-真運行時版本-v2.0.50727指定版本-假強名稱-假版本-1.0.11211.0在……里面MyWebProject 1我通過以下方式添加了對ProjectMyBaseProject的引用:“AddReference.”→“Projects”選項卡→選擇“MyBaseProject”。除下列成員外,此引用的屬性相同:描述-路徑-D:\webs\CMS\MyBaseProject\bin\Debug\MyBaseProject.dll版本-1.0.0.0如果我在VisualStudio將elmah.dll文件復制到我的MyWebProject 1垃圾箱目錄,以及MyBaseProject.dll!但是如果我清理和跑MSBuild對于解決方案(通過D:\webs\CMS>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe/t:重構/p:配置=Debug MyProject.sln)elmah.dll失蹤在MyWebProject 1的bin目錄中-盡管構建本身不包含警告或錯誤!我已經確保MyBaseProject的.csproj包含私元素,其值為“true”(應該是“復制本地“在VisualStudio中):<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">   <SpecificVersion>False</SpecificVersion>   <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>     **<Private>true</Private>**</Reference>(默認情況下,私有標記沒有出現在.csproj的XML中,盡管VisualStudio說“復制本地”為true。我將“復制本地”切換為假保存-并將其重新設置為true-保存!)MSBuild有什么問題?如何將(elmah.dll)引用復制到MyWebProject 1的bin中?我不想在每個項目的后置命令中添加一個后期復制操作!(想象一下,我會有許多項目依賴于MyBaseProject!)
查看完整描述

3 回答

?
DIEA

TA貢獻1820條經驗 獲得超3個贊

我不知道在VisualStudio和MsBuild之間構建時為什么會有所不同,但下面是我在MsBuild和VisualStudio中遇到這個問題時所發現的。

解釋

對于一個示例場景,假設我們有項目X、程序集A和程序集B。程序集A引用程序集B,所以項目X包括對A和B的引用。此外,項目X包括引用程序集A的代碼(例如A.SomeFunction()?,F在,創建一個引用項目X的新項目Y。

因此,依賴鏈如下所示:Y=>X=>A=>B

Visual Studio/MSBuild試圖保持智能,只將引用帶到它檢測到項目X所需的項目Y中;它這樣做是為了避免項目Y中的引用污染。問題是,由于項目X實際上沒有包含任何顯式使用程序集B的代碼(例如B.SomeFunction(),VS/MSBuild不會檢測到X需要B,因此不會將其復制到項目Y的bin目錄中;它只復制X和A程序集。

您有兩個解決此問題的選項,這兩個選項都將導致程序集B被復制到項目Y的bin目錄中:

  1. 在項目Y中添加對程序集B的引用。
  2. 將虛擬代碼添加到項目X中使用程序集B的文件中。

就我個人而言,出于幾個原因,我更喜歡備選方案2。

  1. 如果您以后添加了引用項目X的另一個項目,您將不必記住也包括對程序集B的引用(就像您在選項1中所做的那樣)。
  2. 您可以有明確的注釋,說明為什么虛擬代碼需要在那里,而不是刪除它。因此,如果有人無意中刪除了代碼(例如,使用一個尋找未使用代碼的重構工具),您可以從源代碼管理中很容易地看到該代碼是必需的,并進行還原。如果使用選項1,而有人使用重構工具來清除未使用的引用,則沒有任何注釋;您只會看到.csproj文件中刪除了引用。

下面是我通常在遇到這種情況時添加的“虛擬代碼”的示例。

    // DO NOT DELETE THIS CODE UNLESS WE NO LONGER REQUIRE ASSEMBLY A!!!
    private void DummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE()
    {
        // Assembly A is used by this file, and that assembly depends on assembly B,
        // but this project does not have any code that explicitly references assembly B. Therefore, when another project references
        // this project, this project's assembly and the assembly A get copied to the project's bin directory, but not
        // assembly B. So in order to get the required assembly B copied over, we add some dummy code here (that never
        // gets called) that references assembly B; this will flag VS/MSBuild to copy the required assembly B over as well.
        var dummyType = typeof(B.SomeClass);
        Console.WriteLine(dummyType.FullName);
    }


查看完整回答
反對 回復 2019-07-01
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

如果您沒有在代碼中直接使用程序集,則VisualStudio在嘗試幫助時檢測沒有使用它,并且沒有將它包含在輸出中。我不知道您為什么會看到VisualStudio和MSBuild之間的不同行為。您可以嘗試將構建輸出設置為兩種類型的診斷,并比較結果,查看其發散點。

對于elmah.dll引用,如果沒有在代碼中直接引用它,可以將其作為項目項添加到項目中,并將BuildAction設置為Content以及輸出目錄的副本到Always.


查看完整回答
反對 回復 2019-07-01
  • 3 回答
  • 0 關注
  • 1279 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號