Не удается получить типы из файла.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>