【问题标题】:Analyze 64-bit DLL from within T4 template in Visual Studio (32-bit) using Reflection在 Visual Studio(32 位)中使用反射从 T4 模板中分析 64 位 DLL
【发布时间】:2013-09-29 21:36:46
【问题描述】:

我想使用反射从 T4 模板中分析 DLL,以便我可以根据反射分析的结果生成代码。我知道 EnvDTE 会是一个更好的选择,但在我的情况下这是不可能的,原因有很多。

反射的问题在于 DLL 是 64 位 DLL,如果我在 T4 模板中加载它,我会得到一个 BadImageFormatException,因为我试图将 64 位 DLL 加载到 32 位进程中( Visual Studio 2012)。

有什么方法可以在 T4 中分析该 DLL 的内容,最好使用反射?

我已经考虑过编写一个控制台应用程序来分析 DLL,将结果写入一个 XML 文件,然后由 T4 模板使用,但这并不是我最喜欢的解决方案...

顺便说一句:DLL 是托管 C++ DLL。所以 Roslyn 也没有选择,因为它只支持 C# 和 VB)。

【问题讨论】:

    标签: reflection 64-bit 32bit-64bit t4


    【解决方案1】:

    值得测试的一点是,如果加载用于反射的程序集仅对您有效。我做了一些实验,似乎它成功地将 64 位程序集加载到 32 位进程中。它显然无法执行,但如果我理解正确的话,这对你来说应该没问题:

    查看完整示例:https://github.com/mrange/CodeStack/tree/master/q18985529/Reflect

    var assembly = Assembly.ReflectionOnlyLoad ("X64");
    
    var types = assembly.GetTypes ();
    
    foreach (var type in types)
    {
        Console.WriteLine (type.FullName);
    
        foreach (var field in type.GetFields ())
        {
            Console.WriteLine ("  {0} {1}", field.FieldType, field.Name);
        }
    
        foreach (var property in type.GetProperties ())
        {
            Console.WriteLine ("  {0} {1}", property.PropertyType, property.Name);
        }
    
    }
    

    为 ReflectionOnly 加载有一些缺点 IIRC,但有时它是值得的。

    【讨论】:

    • 谢谢!这终于奏效了!一开始我已经尝试过了,但是在转换模板时遇到了几个错误。但是,在阅读了一些有关 ReflectionOnlyLoad 的文档后,我发现您需要手动加载所有依赖程序集。在我这样做之后,它就像一个魅力!
    • 很高兴听到这个消息。
    【解决方案2】:

    您也可以尝试通过运行corflags T4VSHostProcess.exe /32BITREQ- /Force 来修改 T4VSHostProcess.exe 以作为 64 位进程运行。但是此修改将修复您进行此修改的 PC 上的情况。还要确定您在做什么(备份、在 Program Files 之外尝试等)。

    备份您的 T4VSHostProcess.exe 文件。为避免访问权限问题,请将您的 T4VSHostProcess.exe 进程复制到 Program Files 之外的某个文件夹中。运行以下命令,然后将 T4VSHostProcess.exe 复制到原始文件夹。

    C:\Tools\T4>corflags T4VSHostProcess.exe /32BITREQ- /Force
    Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.6.1590.0
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    corflags : warning CF011 : The specified file is strong name signed.  Using /Force will invalidate the signature of this image and will require the assembly to be resigned.
    

    您可以忽略来自 CorFlags 工具的警告。

    您可以通过不带选项运行 corflags T4VSHostProcess.exe 来确定已为 T4VSHostProcess.exe 设置了哪些标志。

    之前:

    C:\Tools\T4>corflags T4VSHostProcess.exe
    Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.6.1590.0
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Version   : v4.0.30319
    CLR Header: 2.5
    PE        : PE32
    CorFlags  : 0xb
    ILONLY    : 1
    32BITREQ  : 1
    32BITPREF : 0
    Signed    : 1
    

    之后:

    C:\Tools\T4>corflags T4VSHostProcess.exe
    Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.6.1590.0
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Version   : v4.0.30319
    CLR Header: 2.5
    PE        : PE32
    CorFlags  : 0x9
    ILONLY    : 1
    32BITREQ  : 0
    32BITPREF : 0
    Signed    : 1
    
    

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2022-01-20
      • 2013-11-21
      • 2018-11-13
      • 2012-06-06
      • 2013-06-08
      相关资源
      最近更新 更多