2013-09-24 1 views
1

Я хотел бы проанализировать DLL из шаблона T4 с использованием Reflection, чтобы я мог генерировать код на основе результатов отражения анализ. Я знаю, что EnvDTE будет лучшим вариантом, но это невозможно в моем случае по нескольким причинам.Анализ 64-разрядной библиотеки DLL изнутри шаблона T4 в Visual Studio (32-разрядная версия) с использованием Reflection

Проблема с отражением заключается в том, что DLL представляет собой 64-разрядную DLL, и если я загружаю ее в шаблон T4, я получаю BadImageFormatException, потому что я пытаюсь загрузить 64-разрядную DLL в 32-разрядный процесс (Visual Studio 2012).

Есть ли способ проанализировать содержимое этой DLL внутри T4, предпочтительно используя отражение?

Я уже думал о написании консольного приложения, которое анализирует DLL, записывает результат в XML-файл, который затем потребляется в шаблоне Т4, но это на самом деле не мое любимое решение ...

BTW: DLL - это управляемая C++ DLL. Таким образом, Roslyn не является вариантом, потому что он поддерживает только C# и VB).

ответ

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

Спасибо! Это, наконец, работает! Я уже пробовал это в начале, но получил несколько ошибок при преобразовании шаблона. Однако, прочитав некоторые документы о ReflectionOnlyLoad, я обнаружил, что вам нужно загрузить все зависимые сборки вручную. После того, как я это сделал, он работал как шарм! – gehho

+0

Это здорово. – FuleSnabel