Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Cómo puedo saber mi aplicación .NET dónde buscar un montaje particular que necesita (que no sea el GAC o la carpeta donde se ejecuta la aplicación de)? Por ejemplo, me gustaría poner una asamblea en la carpeta Temp del usuario y tienen mi solicitud sabe que el ensamblaje de referencia se encuentra en la carpeta temporal.

Gracias

¿Fue útil?

Solución

Puede utilizar el evento AppDomain.AssemblyResolve añadir a medida Resolvers Asamblea. Esto le permite apuntar a otros directorios o bases de datos incluso para obtener ensamblajes según sea necesario.

Incluso he utilizado un código similar para descargar asambleas de una base de datos y almacenar en IsolatedStorage. El nombre de archivo como un hash del nombre de ensamblado completo. A continuación, la base de datos sólo tendría que descargar en el primer tiempo a resolver y todas las resoluciones futuras serán atendidos por el sistema de archivos. Lo mejor de AssemblyResolve sobre el evento es que se puede utilizar Type.GetType () y el construido en Serializadores.

static string lookupPath = @"c:\otherbin";

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

static Assembly CurrentDomain_AssemblyResolve(object sender, 
                                              ResolveEventArgs args)
{
    var assemblyname = new AssemblyName(args.Name).Name;
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
    var assembly = Assembly.LoadFrom(assemblyFileName);
    return assembly;
}

Otros consejos

Vea esta discusión de algunos de los temas en cuestión:

http://bytes.com/topic/c -Sharp / respuestas / 248203-dinámico-ensamblaje de carga

Básicamente, no se puede cambiar el AppBase de una dominio de aplicación después de que ha sido creado. Debe especificar como parte de la configuración antes de crear uno nuevo, que costumbre ayudarle en el valor por defecto dominio de aplicación.

Si el conjunto que desea cargar se encuentra en un directorio por debajo de la actual AppBase entonces usted puede agregar su ruta relativa mediante el AppendPrivatePath (relativePath), y luego usar Assembly.Load - el tiempo de ejecución probará los subdirectorios para usted. Esta es la mejor / manera más fácil manejarlo.

System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library /1009fa28.aspx

Otra alternativa es manejar Asamblea resolver eventos a sí mismo como en esta pregunta StackOverflow: ¿Cómo agregar carpeta a la ruta de búsqueda de montaje en tiempo de ejecución en .NET?

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