gpt4 book ai didi

T4 引用的组装 block 构建

转载 作者:行者123 更新时间:2023-12-04 17:28:00 25 4
gpt4 key购买 nike

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

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

  • T4 模板包含这样的程序集引用:
    <#@ assembly name="$(SolutionDir)\A\bin\Debug\A.dll" #>

    该模板实例化类 C 的一个实例。当我运行 T4 模板时,处理器加载项目 A 的 dll 并正确创建输出。当我想更改项目 A 中的某些内容时出现错误,例如修改类 C 或 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.



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

    最佳答案

    我正在使用 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);

    关于T4 引用的组装 block 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4672064/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com