【问题标题】:How do you use .net Reflection with T4?您如何将 .net 反射与 T4 结合使用?
【发布时间】:2009-12-06 22:37:42
【问题描述】:

我有一个包含文本模板的 c# 项目。我希望这个模板能够根据项目中的 C# 类的反射生成一些 SQL。

如何使用 T4 访问当前项目的内容?是否有可能,如果可以,反射是否可用,还是只能访问必须解析的原始源?

提前致谢!

【问题讨论】:

标签: c# .net reflection t4


【解决方案1】:

如何使用 T4 访问当前项目的内容?

一种方法是使用 EnvDTE COM 组件。谷歌搜索 T4 和 EnvDTE 应该会带回大量示例。

有没有可能,如果有,Reflection 是否可用,或者是否可以访问 只是必须解析的原始源?

反射绝对可以从 T4 获得。它的工作原理与您预期的一样。

Oleg Sych 有很多关于常见 T4 使用场景的精彩博客文章,但也有很多其他关于 T4 的资源。

【讨论】:

  • 反射通常被认为是通过 T4 的一种不好的方法,因为它会锁定文件或程序集,因此您无法对其进行编辑,EnvDTE COM 没有此限制
  • @Maslow:每当您从 Visual Studio 中的 T4 以任何方式访问 DLL(反射与否)时,DLL 都会被锁定并且在不关闭 Visual Studio 并重新打开它的情况下无法轻松更改。我个人认为这是 Visual Studio T4 实现中的一个错误(微软可能会认为这是一个缓存功能)。 EnvDTE 也会发生锁定,但您并没有尝试更改该 DLL,因此您不会注意到它已被锁定,这并不重要。此锁定问题与反射无关,即使您不使用反射也会发生。
  • @Michael - Oleg Sync 明确表示不要在 T4 中使用反射 stackoverflow.com/questions/1153542/… 我不知道原因,也许上下文不同,但这就是我添加到这个线程的内容,我应该找到链接并将其包含在初始评论中。
  • @Maslow:我知道 Oleg 的那篇文章(我很久以前就支持 orsogufo 的评论),我想我现在明白你想要传达的内容了。是的,对于这个问题中的场景,有比不锁定 DLL 的反射更好的选择。调用 DLL 上的方法是导致 DLL 被锁定的原因,并且有一些方法可以在不调用方法的情况下检查 DLL。谢谢。
  • Reflection 在 Vs2010 SP1 中变得可行。
【解决方案2】:

除了锁定问题之外,还要小心在 T4 模板中使用反射。 VS2010 中的模板生成器针对 4.0 版本的框架运行,因此如果您为 3.5 或更低版本生成代码,则可能会引入不需要的依赖项。

在使用反射来决定是否为各种 BCL 类型生成对 ToString 的无参数或参数化调用之后,我才发现了这一点。 TimeSpan 在 2.0 中只有 ToString(),但是 4.0 增加了 ToString(string) :P

【讨论】:

    【解决方案3】:

    虽然这并不能解决锁定问题(虽然我听说 VS2010 可以解决),但您可以尝试将 dll 复制到临时位置并使用复制的程序集..

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".txt" #>
    <#@ import namespace="System.Reflection" #>
    <#@ import namespace="System.IO" #>
    <#    
    var newFileName = System.IO.Path.GetTempFileName();
    System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true);
    
    var assembly = Assembly.LoadFrom(newFileName);
    var type = assembly.GetType("CustomAssembly.DummyClass");   
    #>
    <#=newFileName#>
    <#=type#>
    

    【讨论】:

    • 是的,这避免了锁定原始文件,但 AppDomain 加载程序集一次并且不会再次加载它(无论文件名如何)。我未能成功将文件加载到新的应用程序域中,以便在完成后再次卸载它。
    • 使用底层流将程序集加载为字节数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多