Realmente traté de implementar algún tipo de ‘vinculado estáticamente’ asambleas, dentro de mi solución. Así que he intentado lo siguiente:

  • La adición de una referencia a mi asamblea con CopyLocal = false
  • La adición de la .archivo dll sí mismo para mi solución con «Añadir enlace»
  • La adición de la .archivo dll sí mismo para mi los recursos con «Agregar Recurso’ – ‘Agregar Archivo Existente’
  • La adición de algún tipo de mi asamblea en Form1 como private MyObject temp = new MyObject();

Después de estos pasos tengo FileNotFoundException como se esperaba. Así que vamos a intentar cargar el ensamblado dentro de la AssemblyResolveEvent con este truco rápido

AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
    {
        Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
        return MyAssembly;
    };

Así que esto funciona! Soy capaz de cargar mi asamblea de un archivo de recursos dentro de un AssemblyResolveEvent. Pero este evento sólo sucede, si no podía encontrar a mi asamblea en cualquier otro lugar. Pero, ¿cómo puedo obtener mi asamblea cargarse antes de .Net intenta buscar en diferentes lugares??

Debido a los hechos de Comprobando Previamente Ensamblados de Referencia pensé que sería posible cargar la asamblea de antemano en el dominio y este sería tomado.

He intentado dentro de este programa.cs mediante el siguiente método Main ()

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 más mejor, si me carga el ensamblado de nuevo y echa un vistazo en dominio de aplicación.CurrentDomain.GetAssemblies() puedo ver que mi ensamblado se carga dos veces!!

Por lo que cualquier idea de por qué la carga de la asamblea no deben ser tomados en cuenta cuando se carga antes de que el evento AssemblyResolve?? Con la ayuda de el depurador yo también devuelve un valor null cuando la llamada provenía AssemblyResolve, pero en este caso tengo una FileNotFoundException como al principio.

OriginalEl autor Oliver | 2009-07-21

2 Comentarios

  1. 3

    Sólo en caso de que no lo sepan, hay una herramienta llamada ILMerge de MS de Investigación que combina ensamblados en un solo archivo.

    También puede crear varios archivos de conjuntos por medio de la Herramienta Assembly Linker.

    Más a la respuesta que usted pregunta original, el problema creo que es que el tiempo de ejecución no sabe que la asamblea se cargan manualmente es la que debe estar buscando. Así, en la asamblea resolver evento en lugar de cargar el ensamblado de nuevo, acaba de pasar de nuevo la referencia a la asamblea que ha manualmente.

    ILMerge ya se utiliza en algunas otras situaciones, pero para este caso no es la «mejor» solución. Dando en AssemblyResolve la misma asamblea de la espalda no es también una buena solución, porque si la misma asamblea también se encuentra en la carpeta de programa o GAC esta el uno será tomado, y el evento no se produce.

    OriginalEl autor Sijin

  2. 3

    El CLR Cuaderno no sabe que LoadMyAssemblies() hace lo mismo que el evento AssemblyResolve, y que ambos están tratando de mirar por la misma asamblea y de carga.

    AssemblyResolve evento siempre se disparó en el momento en que el Cuaderno decide que se ha buscado en todos los lugares posibles (que se pueden buscar wrt que la aplicación) y no podía encontrar una coincidencia.

    Esto nos lleva a la pregunta original, que es, ¿por qué quieres enlazar estáticamente su ensamblados administrados? Lee este hilo para mucha discusión sobre este La vinculación estática ventajas

    Voy a seguir adelante y responder a la parte sobre cómo evitar golpear el evento AssemblyResolve
    1) Colocar el ensamblado en la GAC. Tan lejos como el Cuaderno, el GAC siempre gana.
    2) el Lugar de su asamblea en el sondeo de ruta de acceso y asegúrese de que el Cuaderno recoge (vea el artículo » Cómo el tiempo de ejecución localiza asambleas en MSDN para obtener más información sobre esto).

    Tienes razón, que el CLR Cuaderno no sabe nada acerca de mi función. Pero, como ya se ha mencionado que se disparará el evento AssemblyResolve cuando se ha buscado en todos los lugares posibles. Pero eso no es cierto! Simplemente no se veía en la lista de ensamblados cargados dentro de la corriente de AppDomain! Pero después de leer esto (msdn.microsoft.com/en-us/library/aa98tba8.aspx) se debe buscar allí.

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here