2012-02-03 5 views
3

Я хочу вывести типы в файле .winmd с учетом его пути. Я скопировал файл winmd с моей машины для предварительного просмотра Windows 8 на мою машину dev. Я написал небольшое тестовое приложение (в C#, .NET 4.0, а не 4.5), которое пытается загрузить сборку во время выполнения, учитывая ее путь и выводит типы в нем. Хотя сборка была загружена, произошло исключение, когда я попытался получить типы.Невозможно получить типы из .winmd-файла

Вот код:

static void Main(string[] args) 
{ 
    if (args.Length != 1) return; 

    var path = args[0]; 
    if (!System.IO.File.Exists(path)) 
    { 
     Console.WriteLine("file not found : " + path); 
     return; 
    } 

    var asm = System.Reflection.Assembly.LoadFrom(path); // load successful. 

    Console.WriteLine("loaded "); 
    string name = asm.GetName().Name; 
    Console.WriteLine(name); 

    System.Type[] types = asm.GetTypes(); // exception occurs here 

    foreach(var type in types) 
    { 
     // output type name 
    } 
} 

Исключение типа ReflectionTypeLoadException. Свойством Message является: Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации.

Свойство LoaderExceptions, содержащее основное исключение, исключение TypeLoadException. Свойство Message имеет следующее значение: Плохое использование атрибута Runtime Impl.

Никто не знает, почему я не могу читать типы?

Спасибо.

Примечание: Я знаю, что использую .NET 4.0. Но в .NET 4.5 (тот, который был в предварительном просмотре Windows 8) я не мог загрузить сборку из файла во время выполнения. В классе Assembly нет метода, который делает это.

ответ

4

В то время как файлы .winmd используют формат файла ECMA 355, они НЕ являются сборками .Net, и маловероятно, что вы сможете напрямую читать файлы с использованием .Net framework.

Если вы используете версию ILDASM, поставляемую с предварительным просмотром, вы можете визуально просмотреть типы в файлах. Вы также можете использовать ildasm для вывода текстового файла, содержащего типы в файле метаданных. Я считаю, что рефлектор .Net также может это сделать.

Если вам необходимо перечислить типы в файле winmd программно, я предлагаю вам использовать unmanaged metadata reading APIs. Так мы читаем файлы метаданных для наших инструментов разработки внутри.

Если вы работаете над сборкой предварительного просмотра разработчика, я предлагаю вам ознакомиться с API RoGetMetaDataFile - это API, используемый механизмом javascript Chakra для открытия файла метаданных для определенного типа.

0

Для работы с * .winmd файлов вы должны установить в файле проекта внутри PropertyGroup

<TargetPlatformVersion>8.0</TargetPlatformVersion> 
2

WinMDs являются только метаданные сборки. Использование ReflectionOnlyLoadFrom должно сделать трюк.

Следующий код работает.

 var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(winmdPath); 


     foreach (var type in assembly.GetTypes()) 
     { 
      Console.WriteLine("type found name = " + type.Name); 
     }