我想使用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)。
答案 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