2014-01-24 76 views
4

我試圖讓我的T4模板以實用的方式在我的解決方案中引用我的程序集,以便在更改調試併發布,它將包含來自我的解決方案的正確程序集。在運行T4模板時將解決方案配置(調試/發佈)包含在解決方案中

這是我曾嘗試:

<# 
    // Figured out how to get the current Configuration 
    var serviceProvider = Host as IServiceProvider; 
    var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
    string ConfigName = dte.Solution.SolutionBuild.ActiveConfiguration.Name; 

    // I have verified that I am getting the strings "Debug", and "Release" 
    if (configName == "Debug") { 
#> 
    <#@ include file="template.Debug.tt" #> 
<# } else { #> 
    <#@ include file="template.Release.tt" #> 
<# } #> 

的template.Debug.tt文件看起來是這樣的:

<#@ Assembly 
name="$(SolutionDir)TestProject.Core/bin/Debug/TestProject.Core.dll"#> 

而且template.Release.tt文件看起來像這樣:

<#@ Assembly 
name="$(SolutionDir)TestProject.Core/bin/Release/TestProject.Core.dll"#> 

我在嘗試運行主T4時出現此錯誤:

錯誤1編譯轉換:具有相同的簡單名稱'TestProject.Core',Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null的程序集已被導入。嘗試刪除其中一個引用或簽署它們以並排啓用。

我猜預處理程序處理程序集包含行,因爲它是沿兩個執行路徑發生,這會導致兩個程序集被引用。

想這太:

<#@ Assembly 
name="$(SolutionDir)TestProject.Core/bin/$(Configuration)/TestProject.Core.dll"#> 

有沒有辦法來添加$(配置)?這似乎是最合理的選擇

其他人似乎只是硬編碼調試他們的路徑。

引用錯誤的DLL並且不知道它在調試時非常煩人,並且在將代碼發佈到生產環境時無法順利進行。

回答

0

一個想法是,你的T4支持DLL可以被認爲是構建環境的一部分,因此Debug/Relase不適用。

對於支持dll更改所有配置的構建路徑轉到例如$(SolutionDir)\ BuildArtifacts並在T4文件中引用該位置。

希望這有助於

PS。 我所做的(雖然我知道我是少數派)避免T4支持dll,部分原因是這些,只是將所有東西都寫成T4「腳本」。

+0

你讓我想到我想要dll的原因,我想現在我只是複製我需要的模板中的代碼。我會接受這個答案,直到有其他事情出現。 – jSnake04

+0

有些方法可以通過使用// <#+作爲註釋來使C#代碼可以被包含。這使得C#代碼既可編譯又可包含。如果你想要更多的細節,只需要問。 – FuleSnabel