使用Reflection在Visual Studio(32位)中的T4模板内分析64位DLL

时间:2013-09-24 15:16:58

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

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

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

有没有办法在T4中分析该DLL的内容,最好是使用反射?

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

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

2 个答案:

答案 0 :(得分:3)

值得测试的是,如果加载反射装配仅适用于您。我做了一些实验,似乎成功将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但有时它是值得的。

答案 1 :(得分:0)

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

备份您的 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