Не удается получить типы из файла.winmd

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

Вот код:

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 нет метода, который бы это делал.

3 ответа

Решение

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

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

Если вам НУЖНО программно перечислять типы в файле winmd, я предлагаю вам использовать API-интерфейсы чтения неуправляемых метаданных. Вот как мы читаем файлы метаданных для наших инструментов разработки внутри.

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

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

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

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


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

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

<TargetPlatformVersion>8.0</TargetPlatformVersion>
Другие вопросы по тегам