【问题标题】:T4 and MSBuild integration issuesT4 和 MSBuild 集成问题
【发布时间】:2011-11-24 06:04:16
【问题描述】:

我有一个 T4 模板,它引用另一个项目并对其输出程序集进行一些反射以生成一些代码。

在设计时使用 Visual Studio 2010 SP1 可以正常工作,因为程序集在使用之前是影子复制的。

但是,当我尝试使用 Visual Studio 建模 SDK 中的 MSBuild 任务进行构建时集成时,引用的程序集在第一次发生这种情况时被锁定,之后我无法重建引用的项目。

我假设这是因为转换引擎是 MSBuild 下完全不同的主机,并且不包括该 Visual Studio 主机所做的影子复制修复。

谁能确认这是否是一个已知问题以及是否有任何解决方法?

【问题讨论】:

    标签: visual-studio-2010 msbuild t4


    【解决方案1】:

    我意识到这是一个较旧的线程,但我想分享我的经验,希望它可以帮助其他人。

    在 VS 2012 中,我们现在在设计器中支持卷影复制。但是,在构建时转换 T4 模板(使用 MSBuild 或在 Visual Studio 中构建)时,我们仍然会遇到上述程序集锁定问题。

    为了克服这个问题,我们将程序集作为字节数组加载到我们的 T4 AppDomain 中。这使我们能够在不锁定程序集的情况下反映程序集。

    <#@ template debug="false" hostspecific="true" language="C#" #>
    <#@ assembly name="System.Core" #>
    <#@ assembly name="System.Linq" #>
    <#@ assembly name="System.Runtime" #>
    <#@ import namespace="System.Reflection" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Linq" #>
    <#@ import namespace="System.Text" #>
    <#@ import namespace="System.Collections.Generic" #>
    <#@ output extension=".txt" #>
    <#
        var assemblyPath = this.Host.ResolvePath(@"..\Path\To.dll");
        var assembly = LoadAssembly(assemblyPath);
        foreach (Type t in assembly.GetTypes()) 
        { 
    #>
    <#= t.FullName #>
    <#
        }
    #>
    <#+
        public Assembly LoadAssembly(string path)
        {
            return Assembly.Load(File.ReadAllBytes(path));
        }
    #>
    

    【讨论】:

    • 谢谢,这是一个有用的技巧。不幸的是,它不适用于我的特定情况,因为我正在尝试加载 Silverlight DLL,并且调用 Assembly.Load() 会导致我无法解决的问题。将标记为答案。
    • 谢谢。出于这个原因,我尝试在可行的情况下使用可移植类库。我可以想到两个可能对您有所帮助的选项。 1. 将您想要模板化的类移动到 PCL。 2. 使用您的 SL 类实现的接口创建一个 PCL。然后你会反映接口而不是 SL 类。
    【解决方案2】:

    为了提高性能,T4引擎重用了模板化AppDomain 用于多个模板转换,这会导致所有引用 要锁定的程序集文件。如果您正在使用,这会出现问题 在代码生成期间您自己的程序集,因为程序集文件 在文件被 T4 解锁之前无法重新编译。你可以强制 T4 通过关闭并重新打开 Visual Studio 来卸载文件 解决方案或通过重新启动 Visual Studio 本身。或者, 考虑使用 T4 中可用的 VolatileAssembly 自定义指令 工具箱,在加载之前创建程序集的影子副本 它。

    http://www.olegsych.com/2008/02/t4-assembly-directive/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多