【问题标题】:T4 referenced assembly blocks buildT4 引用的程序集块构建
【发布时间】:2016-09-04 22:53:42
【问题描述】:

在 Visual Studio 2010 中,我有以下项目布局:

  • 解决方案
    • 项目A
      • C 类
      • D 类
    • 项目B
      • T4 模板

T4 模板包含这样的程序集引用:

<#@ assembly name="$(SolutionDir)\A\bin\Debug\A.dll" #>

模板实例化类 C 的实例。当我运行 T4 模板时,处理器加载项目 A 的 dll 并正确创建输出。当我想更改项目 A 中的某些内容时会出现错误,比如修改 C 类或 D 类。

无法复制文件“obj\Debug\A.dll” 到“bin\Debug\A.dll”。过程 无法访问文件 'bin\Debug\A.dll' 因为它正在 被另一个进程使用。

我发现摆脱此错误的唯一方法是重新启动 Visual Studio。有没有其他方法可以强制从 VS 中卸载 A.dll 程序集?

【问题讨论】:

    标签: t4 visual-studio-2010


    【解决方案1】:

    我使用的是 VS2010 SP1,并且在第一次构建后在访问同一项目的类实例的 POST-BUILD 事件期间运行自定义 T4 模板时仍然在构建期间被阻止。

    我如何让它工作是使用反射来访问项目 dll 中的类。

    直接从文件加载 dll 时,我仍然遇到阻塞问题。

    注意:诀窍是将 .dll 作为字节数组加载到内存中,然后从原始字节数组加载程序集。不要使用 Assembly.LoadFrom 从文件加载

    此代码来自我的 T4 模板文件,正在访问静态类“信息”并调用静态方法“版本”以返回字符串值。

    string assemblyPath = Path.Combine(projectPath, @"bin\SampleProject.dll");
    byte[] data;
    
    using (var fs = File.OpenRead(assemblyPath))
    {
        data = new byte[fs.Length];
        fs.Read(data, 0, Convert.ToInt32(fs.Length));
    }
    
    if (data == null || data.Length == 0)
    {
        throw new ApplicationException("Failed to load " + assemblyPath);
    }
    
    var asm = Assembly.Load(data);
    appVersion = (string) asm.GetType("SampleProject.Information").GetField("Version").GetValue(null);
    

    【讨论】:

    • 很好的答案!但是当我出于某种原因通过字节数组获取程序集时,我丢失了 dll 中对象中的所有属性.. 其他人遇到过吗?
    【解决方案2】:

    m0sa 此问题已在 Visual Studio 2010 SP1 中修复。

    如果你不能使用它,在 CodeBox 上的 T4 Toolbox 项目中有一个 VolatileAssembly 指令插件 (http://t4toolbox.codeplex.com/)

    【讨论】:

    • 我正在使用 Visual Studio 2010 SP1,但我仍然看到同样的问题。要解决my problem,我在assembly 指令中使用了绝对路径。知道可能出了什么问题吗?
    • 恐怕没有 - 或者对 SP1 修复的测试没有显示任何问题。如果您可以通过可重复的案例提出连接问题,我们可以查看它。
    • 我在 Visual Studio 2013 中遇到了同样的问题。
    • 在 VS2015 中仍然存在。 :(
    • 我在 Visual Studio 2015 中遇到了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多