T4 参考装配块构建

发布于 2024-10-11 20:01:58 字数 578 浏览 3 评论 0原文

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

In Visual Studio 2010 I have the following project layout:

  • Solution
    • project A
      • class C
      • class D
    • project B
      • T4 template

The T4 template contains a assembly reference like this:

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

The template instantiates an instance of class C. When I run the T4 template the processor loads the project A's dll and correctly creates the output. The error arises when I want to change something in project A, say modify either class C or D.

Unable to copy file "obj\Debug\A.dll"
to "bin\Debug\A.dll". The process
cannot access the file
'bin\Debug\A.dll' because it is being
used by another process.

The only way I found to get rid of this error is to restart Visual Studio. Is there any other way to force the unloading of the A.dll assembly from VS?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笑梦风尘 2024-10-18 20:01:58

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

我如何让它工作是使用 Reflection 访问 Project 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);

Im using VS2010 SP1 and was still getting blocked during build after first build when running a custom T4 template during the POST-BUILD events which accessed instances of classes of the same project.

How I got it to work was to use Reflection to access classes from the Project dll.

I still got the blocking issue when loading the dll directly from the file.

NOTE: The trick was to load the .dll into memory as a byte array and then load the assembly from the raw byte array. DONT load from the file using the Assembly.LoadFrom

This code is from my T4 template file and is accessing a static class "Information" and calling a static Method "Version" to return a string value.

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);
携余温的黄昏 2024-10-18 20:01:58

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

如果您无法使用它,CodeBox 上的 T4 Toolbox 项目中有一个 VolatileAssembly 指令插件 (http: //t4toolbox.codeplex.com/

m0sa
This issue has been fixed in Visual Studio 2010 SP1.

If you're not able to use that, there is a VolatileAssembly directive add-on in the T4 Toolbox project on CodeBox (http://t4toolbox.codeplex.com/)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文