我想使用反射从 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)。
值得测试的一件事是,加载反射程序集是否只适合您。我做了一些实验,似乎成功地将 64 位程序集加载到 32 位进程中。它显然无法执行,但如果我正确理解你的话,这对你来说应该没问题:
完整示例请参见:https://github.com/mrange/CodeStack/tree/master/q18985529/Reflect 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,但有时这是值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)