2015-02-24 39 views
1

暫存非託管庫或資源時的常見做法是將這些資源添加爲項目的鏈接,並將它們設置爲複製到輸出目錄。Visual Studio不復制鏈接文件的目錄

由於Visual Studio的2013年,這是處理得很好,即使它們被引用的庫Foo然後由應用Bar消耗,他們將在Bar的輸出目錄中結束。

儘管對於文件目錄來說,它也不是這樣。

Referenced file in library

在這種情況下,我的應用程序似乎只有文件的這個目錄複製到輸出目錄上只有重建。然後難免我會做幾個構建的行動,我會注意到Libs目錄又是空的。然後做一個重建cef.pak又回來了。

我的解決方案是使用構建步驟手動將Libs目錄複製到輸出目錄。雖然我無法找到適當的宏來一般表示,即使此構建步驟屬於Foo的一部分,我也希望將這些文件複製到Bar(例如,以VS形式的啓動項目)輸出目錄。

更新

謝謝你的偉大的答案大家和測試這一點。我應該澄清一點,如果兩者之間存在額外級別的庫,我仍然會看到這個問題。也就是說參考庫Foo的應用Bar其參考庫Other這是具有這些鏈接文件的那個。在這種情況下,當Other的鏈接文件被設置爲複製到輸出目錄時,它們似乎只能在重建時進行。我對此的解決方案並不盡如人意,它直接使用Foo參考Other

+0

我面臨這個問題(閱讀我的回答)如果你想要更多的解決方案添加評論,我會提供你請提交bug給微軟,也許他們會修復它(上次他們放棄...) – 2015-03-08 10:38:53

+0

接受一個答案,如果它幫助你,或者賞金將被浪費(你仍然會丟掉它) – 2015-03-10 18:00:33

回答

3

除非您重建/清理解決方案,否則VS會從輸出文件夾中刪除文件。 所以我相信你忘了說你的程序(或第三方)這樣做。

第一個:this是一個類似/確切的錯誤的例子。
下載解決方案並執行以下步驟:

  1. 重新生成解決方案
  2. 開酒吧
  3. 的輸出文件夾中的文件cef.pak將在利布斯被存在
  4. 按F5 - >執行酒吧 - >一切都好
  5. 與F5再次執行 - >您將收到一個文件未發現異常
  6. 如果重複步驟1-5,您將收到相同的是行爲

    • 只有Bar沒有變化,並且某些東西(exe/other process/etc)已經刪除了該文件,問題才存在。

第二:我已經遇到過這個問題。 當我的一個團隊成員報告了這個問題,那麼他收到的答案是「這不是一個功能的bug」......

據我所知,沒有「魔法按鈕」來解決對於這個問題。

但有幾個解決方法:

  1. (像你一樣)將前/後生成事件。我建議你在新的構建配置中執行此操作。

  2. 將Foo的構建輸出文件夾更改爲條輸出文件夾。

  3. 在代碼中添加路徑替換如果調試:

    #if DEBUG 
          cefFilePath = <build output of foo> 
    #endif 
    
  4. 把文件作爲嵌入資源,然後將其解壓縮。

  5. 創建一個擴展\外部程序來處理這個問題。每個項目文件保存有關這些文件中的信息:

<ItemGroup> 
    <None Include="Libs\cef.pak"> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </None> 
    </ItemGroup> 

應用/插件會爲你做這項工作。

我可以提供更多解決方案/解決方法,但我相信您做了正確的事情 - >構建事件。

編輯:

我更新的鏈接我的例子。現在該解決方案包含3個解決方案示例。

2

嘗試與VS2013做同樣的事情。它工作得很好,每當我改變Bar的文件,Run Foo(啓動項目)中的某些內容時,最新的文件就被複制到那裏。我只是寫我遵循的步驟,可能是我錯過了某些東西來複制或者錯過了一個步驟。請看看:

  1. 創建兩個項目Foo和Bar
  2. 在利布斯
  3. 在酒吧創建的目錄利布斯
  4. 添加一個文本文件「TextFile1.txt」
  5. 右鍵 - >屬性>複製到輸出目錄=複製總是
  6. 添加Foo項目的Bar引用
  7. 從Foo的Main方法開始讀取TextFile的文本。從Bin \ Debug \ Libs目錄中讀取文件。
  8. 每當我按F5我看到最新的文件被複制到那裏。
+0

你的回答不起作用,我已經遇到了這個問題。在我的回答中,我提出瞭解決方案的鏈接來展示這個問題。在重建文件被複制到輸出Bar的文件夾時,所以「複製到輸出目錄」是:「始終複製」或「如果新的複製」。 「複製到輸出目錄=複製總是」將只複製文件到Foo的輸出文件夾,然後MsBuild將文件複製到酒吧文件夾。在這種情況下,MsBuild沒有做這個副本。 – 2015-03-08 10:31:35

1

編輯「Foo。的csproj」(確保項目在VS關閉),並添加這個添加的底部,代替註釋掉例子已經存在在每一個新的項目文件(使用自己的路徑):

<Target Name="AfterBuild"> 
    <Copy SourceFiles="Libs\cef.pak;Libs\file2.ext" DestinationFolder="..\..\Bar Solution\Bar Project\output" SkipUnchangedFiles="True" OverwriteReadOnlyFiles="True" /> 
</Target> 

編輯「Bar.csproj」爲好,以防萬一改變這些文件不會觸發富建:

<Target Name="BeforeBuild"> 
    <Copy SourceFiles="..\..\Foo Solution\Foo Project\Libs\cef.pak;..\..\Foo Solution\Foo Project\Libs\file2.ext" DestinationFolder="output" SkipUnchangedFiles="True" OverwriteReadOnlyFiles="True" /> 
</Target> 
相關問題