T4引用的程序集阻塞构建

5
在 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个回答

8
我正在使用VS2010 SP1,但在构建时遇到了阻塞问题。在POST-BUILD事件中,我的自定义T4模板访问了同一项目的类的实例。为了解决这个问题,我使用了反射来访问项目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);

很棒的答案!但是当我通过字节数组获取程序集时,由于某种原因,我失去了dll中对象的所有属性..有其他人遇到过这个问题吗? - Nemmy

2

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

如果您无法使用该版本,可以在CodeBox上的T4 Toolbox项目中添加VolatileAssembly指令插件(http://t4toolbox.codeplex.com/)。


我正在使用Visual Studio 2010 SP1,但问题仍然存在。为了解决我的问题,我在assembly指令中使用了绝对路径。有什么可能出错的地方吗? - Chris Phillips
很抱歉,或者说在SP1修复程序上测试并没有发现任何问题。如果您能提供一个可重现的案例并提交连接问题,我们可以来看看。 - GarethJ
7
我在Visual Studio 2013中遇到了相同的问题。 - Peter Hedberg
2
仍然存在于VS2015中。:( - Crono
1
我在Visual Studio 2015中遇到了同样的问题。 - user1829319

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接