library fody costura c# dll resources assemblies embed

fody - import dll c#



C#: Cómo incrustar DLL en el archivo de recursos(no copia dll en el directorio del programa) (1)

Tengo una aplicación C # (proyecto A) que requiere X.dll. He agregado el proyecto que produce X.dll a A como referencia en Visual Studio. También agregué la versión de lanzamiento de X.dll a un archivo de recursos en A como binario. Le dije al proyecto A que no copie X.dll en el directorio de salida.

Ahora quiero que A.exe cargue, diga "hey, no puedo encontrar este archivo", mire en el archivo de recursos y use Assembly.Load (byte []) devuelva X.dll. Tengo el código que vuelve a mágico la DLL, pero este código nunca se llama.

Actualmente tengo un proyecto sencillo, solo estoy intentando que funcione. Compila OK. Cuando lo ejecuto, obtengo una excepción FileNotFoundException en X.dll.

Yo tengo:

[STAThread] static void Main() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); }

Pero el punto de interrupción en * CurrentDomain_AssemblyResolve * nunca recibe un golpe. Obtengo una excepción FileNotFoundException inmediatamente. Seguramente hay algo que me falta?


Esta pregunta parece ser muy similar a lo que intentas lograr, y funcionó para el que pregunta.

Fusionar .dll en el ensamblado C #?

¿Estás haciendo algo diferente? Específicamente, si está orientando una versión anterior de .NET Framework, tal vez eso sea una pista para comprender por qué su aplicación se comporta de manera diferente.

En otra dirección, utilice una herramienta como Fusion Log Viewer para analizar lo que sucedía cuando intentaba cargar el ensamblaje. Esto puede dar algunos consejos más. Si logra obtener información de registro, publicarla en la pregunta puede ayudar a alguien a resolverla.

EDITAR: Otra explicación, siguiendo tu comentario.

Bueno, ahora creo que sé cuál es el problema.

En su método Main , se refiere al tipo en el otro dll. Pero lo estás haciendo en código estático , es decir, usas el tipo explícitamente en el código (en lugar de cargarlo dinámicamente por su nombre).

¿Por qué es esto un problema? El CLR intenta cargar su ensamblaje para JIT Main .

Su FileNotFoundException se lanzó mientras se compilaba Main . Main ni siquiera comenzó a ejecutarse, y por lo tanto su controlador de eventos no se registró.

Una manera simple de verificar si estoy en lo cierto es cambiar el código a algo como esto:

static public void Main(string[] args) { AppDomain.CurrentDomain.AssemblyResolve += MyEventHandler; MyMain(); } // The CLR will actually try to load your assembly before even starting the execution // of this method. It needs the assembly in order to JIT the method because it has to // know the Thing type. static public void MyMain() { using(var thing = new Thing()) { // ... } }

La diferencia importante es que Main no tiene dependencia en otro ensamblado, por lo que no habrá ningún problema para JIT y ejecutarlo.

Para cuando MyMain está siendo JIT, su controlador de eventos ya está en su lugar para que pueda cargar el ensamblaje manualmente.

Por cierto, para evitar otra posible falla similar, asegúrese de que la clase en la que se define Main no tenga ningún campo con un tipo del otro ensamblado, porque en este caso también, el CLR intentará cargar el ensamblaje antes de Main comienza, para compilarlo.