T4引用了汇编块构建

时间:2011-01-12 17:46:20

标签: visual-studio-2010 t4 visual-studio-2010-sp1

在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程序集?

2 个答案:

答案 0 :(得分:8)

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

我是如何使用它来使用Reflection来访问Project dll中的类。

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

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

从文件加载

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

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);

答案 1 :(得分:2)

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

如果您无法使用它,CodeBox上的T4工具箱项目中有一个VolatileAssembly指令加载项(http://t4toolbox.codeplex.com/