c# - ¿Por qué no puedo hacer un Assembly.Load de archivos de WinMD?
.net windows-runtime (0)
Estoy intentando escribir un método para obtener todos los espacios de nombres de un ensamblado / archivo WinMD de C #. Por algún motivo, tengo problemas para hacer esto con los archivos winmd porque no puedo cargarlos. Aquí está la parte relevante de mi código (parcialmente robado de esta respuesta sobre la reflexión sobre winmds ):
using System;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices.WindowsRuntime;
public static class Load
{
public static Assembly AssemblyFrom(string path)
{
var domain = AppDomain.CurrentDomain;
ResolveEventHandler assemblyHandler = (o, e) => Assembly.ReflectionOnlyLoad(e.Name);
EventHandler<NamespaceResolveEventArgs> namespaceHandler = (o, e) =>
{
string file = WindowsRuntimeMetadata
.ResolveNamespace(e.NamespaceName, Array.Empty<string>())
.FirstOrDefault();
if (file == null)
return;
var assembly = Assembly.ReflectionOnlyLoadFrom(file);
e.ResolvedAssemblies.Add(assembly);
};
try
{
// Load it! (plain .NET assemblies)
return Assembly.LoadFrom(path);
}
catch
{
try
{
// Hook up the handlers
domain.ReflectionOnlyAssemblyResolve += assemblyHandler;
WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve += namespaceHandler;
// Load it again! (WinMD components)
return Assembly.ReflectionOnlyLoadFrom(path);
}
finally
{
// Detach the handlers
domain.ReflectionOnlyAssemblyResolve -= assemblyHandler;
WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve -= namespaceHandler;
}
}
}
}
Por alguna razón, parece que los archivos winmd están fallando, tanto para las cargas de ensamblaje normales como de reflexión que estoy intentando. Cuando intento hacer un Assembly.LoadFrom
en él obtengo una excepción diciendo que no es compatible (lo cual es de esperar ). Luego, cuando pruebo el método de solo reflexión, obtengo otra excepción (específicamente, una ReflectionTypeLoadException
). Cuando lo LoaderExceptions
y luego LoaderExceptions
propiedad LoaderExceptions
, así:
try
{
// Add the handlers
return Assembly.ReflectionOnlyLoadFrom(path);
}
catch (ReflectionTypeLoadException e)
{
foreach (var inner in e.LoaderExceptions)
Console.WriteLine(inner);
}
finally
{
// Remove the handlers
}
Recibo un montón de error en la consola, así:
Ninguno de los controladores ( assemblyHandler
ni namespaceHandler
) que he agregado parecen ser llamados, tampoco; cuando les agrego Console.WriteLines
, nunca veo salida en la pantalla.
¿Puede alguien decirme por qué sucede esto y cómo solucionarlo? Cualquier ayuda sería muy apreciada, ya que me he estado golpeando la cabeza con esto durante 2 días.
EDITAR: He hecho que la salida completa esté disponible como esencia de GitHub aquí .
EDIT 2: Si tiene instaladas las herramientas de desarrollo de Windows 10, puede intentar ejecutar el método en
C:/Program Files (x86)/Windows Kits/10/References/Windows.Foundation.UniversalApiContract/2.0.0.0/Windows.Foundation.UniversalApiContract.winmd
para obtener una repro.