2

我想使用反射从 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)。

4

2 回答 2

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,但有时它是值得的。

于 2013-09-28T07:10:39.303 回答
0

您也可以尝试通过运行修改 T4VSHostProcess.exe 以作为 64 位进程运行corflags T4VSHostProcess.exe /32BITREQ- /Force。但是此修改将修复您进行此修改的 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

于 2021-02-15T17:49:26.413 回答