Tengo un programa que necesita descubrir archivos DLL de complemento en su host.Escaneo de archivos DLL para ensamblados de .NET con una interfaz particular - ¡algunos archivos DLL arrojan R6034!
Lo hace al enumerar todas las DLL dentro de una ruta (bastante grande). Esta ruta incluye muchas cosas, incluidas las DLL nativas.
foreach (var f in Directory.EnumerateFiles(@"c:\Program Files", "*.dll", SearchOption.AllDirectories))
{
try
{
var assembly = Assembly.LoadFile(f);
var types = assembly.GetTypes();
foreach (var type in types)
{
if (type.GetInterface("My.IInterface") != null)
{
plugins.Add(f);
break;
}
}
assembly = null;
}
catch (Exception e)
{
}
}
Si el escáner realiza un DLL MS tiempo de ejecución (por ejemplo, msvcm80.dll) me sale un error de ejecución R6034 inalcanzable: "Una aplicación ha hecho un intento de cargar la biblioteca de tiempo de ejecución C incorrectamente." Esta ventana bloquea la ejecución del programa. No quiero esta DLL (obviamente); ¿Hay alguna forma de obtener un elegante error de esta situación?
[q relacionadas: ¿hay forma en que un eficiente (por ejemplo, no excepción) de determinar si un DLL es un ensamblado de .NET o no, si que DLL no está cargado actualmente en el espacio de proceso]
Interesante en ReflectionOnlyLoadFrom. Lástima que tiene las mismas limitaciones que solo cargar un ensamblaje de un nombre de pila en el dominio de la aplicación. Y el uso de un dominio de aplicación alternativo es aparentemente extraordinariamente doloroso; No pude encontrar a nadie que haya descrito con éxito cómo tomar otro dominio de aplicación, cargar ensamblajes con éxito (sin dictar tipos específicos) y luego interrogar las propiedades de esos ensamblajes. Bleah. – Joe