1. 程式人生 > >如何讓VS編譯時自動引用Debug|Release版本的dll

如何讓VS編譯時自動引用Debug|Release版本的dll

公司一些早期的專案,把所有工程都放到一個解決方案下了,導致整個解決方案編譯很慢,而且也不便於類庫的複用和維護。因此我們決定把工程按照功能劃分到不同的解決方案裡頭,然後定期釋出dll到TFS配置庫上固定的TeamProject下面,以後應用程式引用時就不新增工程,而是採用新增dll的方式。但是現在遇到一個問題,釋出dll一般會發布Debug和Release兩個版本,那麼應用程式應該引用哪個版本呢?

理想情況下,開發測試的時候應該使用Debug版本,這樣拋異常的時候除錯很方便。正式部署到生產環境的時候可以使用Release版本,這樣效能好一些。但是新增dll的時候VS只允許選擇一個版本。

我們知道,VS支援把工程不同的編譯選項儲存到不同的配置中,編譯時根據當前使用的配置來決定採用什麼樣的編譯選項。預設會新建Debug和Release這兩個配置。開發時我們一般選Debug配置,釋出時一般選擇Release。

Visual studio Configuration manager

如果新增dll時也能根據當前配置引用不同路徑的dll,那就好了。在stackoverflow上搜到了相關的資訊,說可以修改csproj工程檔案,使用VS巨集變數來指定dll路徑。用記事本開啟研究了一番倒也挺簡單的.找到引用類庫的地方:

<ItemGroup> 
  <Reference Include="ClassLibrary1,Version=1.0.0.0,Culture=neutral,processorArchitecture=MSIL"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>Lib\Debug\ClassLibrary1.dll

</HintPath> 
  </Reference>

只需要改成:

<ItemGroup> 
    <Reference Include="ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> 
      <SpecificVersion>False</SpecificVersion> 
      <HintPath>Lib\$(Configuration)\ClassLibrary1.dll</HintPath> 
    </Reference>

這樣編譯時VS就能根據當前配置到Debug或者Release資料夾下尋找相應的dll了。

不過這樣一來,以後新增dll的時候就有點麻煩了,每次都要手工編輯csproj檔案。同事吳突發奇想,能不能在釋出的時候再建一個名為“$(Configuration)”的資料夾,以後直接引用這個資料夾下的dll即可,都不需要修改csproj檔案了。我的第一個反應是VS應該會對這樣的路徑做轉義之類的,因為和內建變數名衝突了。但本著“不確定的事情要通過實驗去驗證”的精神,我做了這個實驗,發現居然可以!VS才不管你路徑包含什麼字串呢。

最後的結論,釋出dll時,需要同時釋出到以下三個資料夾:

  • $(Configuration)\MyLibrary.dll
  • Debug\MyLibrary.dll
  • Release\MyLibrary.dll

其中$(Configuration)資料夾下的dll無所謂哪個版本了,這個純粹只是為了騙過Visual Studio的而已,編譯時根本不會用到。新增dll引用的時候,直接引用$(Configuration)\MyLibrary.dll即可。

希望此文對你有幫助。