En realidad, traté de implementar algún tipo de ensambles "estáticamente vinculados", dentro de mi solución. Así que he intentado lo siguiente:¿Cómo cargar el ensamblado en tiempo de ejecución antes del evento AssemblyResolve?
- añadir una referencia a mi montaje con CopyLocal = false
- Agregar el archivo .dll en sí a mi solución con 'Agregar enlace'
- Agregar el archivo .dll en sí a mis recursos con 'Agregar recurso' - "Agregar archivo existente
- Adición de algún tipo de mi conjunto en Form1 como
private MyObject temp = new MyObject();
Después de estos pasos me dieron el FileNotFoundException como se esperaba. Así que intentemos cargar el ensamblado dentro del AssemblyResolveEvent con este truco rápido
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
return MyAssembly;
};
¡Esto funciona! Puedo cargar mi ensamblaje desde un archivo de recursos dentro de un AssemblyResolveEvent. Pero este evento solo ocurre, si no pudo encontrar mi ensamblaje en otro lugar. Pero ¿cómo puedo hacer que mi ensamblaje se cargue antes de .Net intenta buscar en los diferentes lugares?
Debido a los hechos de Checking for Previously Referenced Assemblies pensé que sería posible cargar el conjunto de antemano en el dominio y esto se tomaría.
yo probamos este dentro Program.cs utilizando el siguiente método principal()
static void Main()
{
LoadMyAssemblies();
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadMyAssemblies();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static Assembly LoadMyAssemblies()
{
Assembly result = AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);
return result;
}
Pero todavía se ejecuta en el ResolveEventHandler. Y mucho mejor, si vuelvo a cargar el ensamblado y echo un vistazo a AppDomain.CurrentDomain.GetAssemblies() ¡puedo ver que mi ensamblaje se carga dos veces!
Así que cualquier idea de por qué no se tendrá mi ensamblado cargado en cuenta cuando se carga antes del evento AssemblyResolve ?? Con la ayuda del depurador también devolví un nulo cuando la llamada vino de AssemblyResolve, pero en este caso obtuve una excepción FileNotFoundException como al principio.
ILMerge ya se utilizará en algunas otras situaciones, pero en este caso no es la "mejor" solución. Dar en AssemblyResolver el mismo ensamblaje tampoco es una buena solución, porque si el mismo ensamblado también se encuentra en la carpeta del programa o GAC, este se tomará y el evento no se lanzará. – Oliver