在Visual Studio 2010中,我有以下项目布局:
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程序集?
答案 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/)