Pregunta

Tengo una aplicación que necesita trabajar con dos versiones de una DLL. Pensé que simplemente compilaría la aplicación una vez, copiaría el EXE en dos directorios y luego copiaría las dos versiones de las DLL a cada uno de estos directorios. FYI, no estoy haciendo nada con el GAC. Sin embargo, estoy obteniendo una FileloadException en la versión con la DLL con la que no se compiló.

En el proyecto, tengo la "versión específica" establecida en falso para la referencia DLL. Pero, tal vez esa sea la configuración incorrecta. ¿Cómo hago que esto funcione con múltiples versiones?

¿Fue útil?

Solución 4

Decidí cambiar el archivo de configuración, simplemente porque es otra cosa que tendría que hacer. En lo que respecta al cambio de dirección para diferentes versiones de la DLL, no creo que tenga ese problema, ya que en realidad estoy usando una interfaz para llamar a mis métodos.

Para dar un poco más de detalle, simplemente necesito crear una instancia de un tipo en múltiples DLL. A partir de ahí, lo trato como un objeto de interfaz. Entonces, aquí está mi solución:

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;

Esto parece funcionar.

Otros consejos

Si el ensamblaje al que está haciendo referencia está firmemente firmado, el CLR no lo cargará si tiene una versión diferente a la que se compiló. En este caso podría usar el archivo de configuración para especificar la versión que desea usar:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YouAssemblyNameWithoutDotDll"
                              publicKeyToken="your-assembly-token"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Por supuesto, esto supone que la nueva versión del ensamblaje tiene las mismas firmas de método o obtendrá un FaltandoMethodException en tiempo de ejecución.

Esto se debe a que cada vez que recompensa DLL, se cambian las direcciones de funciones. Y dado que está vinculando su aplicación en el tiempo de compilación con su DLL, esas direcciones están configuradas para ser solucionadas en su aplicación. Básicamente, debe recompilar su programa cada vez con una nueva versión de DLL (o para ser más precisos, cuando se meta con las datos) o use la carga dinámica y getProcaddress.

Asegúrese de que las dos versiones del ensamblaje tengan la misma Versión de ensamblaje especificada en su archivo AssemblyInfo.cs.

Ex:

[assembly: AssemblyVersion("1.0.0.0")]

Creo que el valor predeterminado generado para nuevos proyectos antes de VS 2008 es:

[assembly: AssemblyVersion("1.0.0.*")]

que incrementará automáticamente la versión de ensamblaje cada vez que se construya.

Esto es particularmente importante para ensamblajes que están firmados Dado que el fuerte nombre de una asamblea incluye su versión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top