2009-10-13 26 views
6

¿Cómo puedo decirle a mi aplicación .NET dónde buscar un ensamble en particular que necesita (que no sea el GAC o la carpeta desde donde se ejecuta la aplicación)? Por ejemplo, me gustaría poner un ensamblaje en la carpeta Temp del usuario y hacer que mi aplicación sepa que el ensamblado al que se hace referencia está en la carpeta temp.Buscando el ensamblado .NET en un lugar diferente

Gracias

Respuesta

6

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

Incluso he usado un código similar para descargar ensamblajes de una base de datos y almacenar en IsolatedStorage. El nombre del archivo como un hash del nombre completo del ensamblado. Entonces, la base de datos solo debería descargarse la primera vez que la resuelva y todas las resoluciones futuras serán atendidas por el sistema de archivos. Lo mejor sobre el evento AssemblyResolve es que puedes usarlo Type.GetType() y los Serializers integrados.

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; 
} 
+1

Como se mencionó [aquí] (http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event- Sugerencias), use 'string assemblyname = new AssemblyName (args.Name) .Name;' en lugar de usar 'Split (',')'. – kroimon

+0

Gracias por la sugerencia. –

3

Ver esta discusión de algunos de los temas involucrados:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

Básicamente, no se puede cambiar el AppBase de un dominio de aplicación después de que ha sido creado. Debe especificarlo como parte de la configuración antes de crear uno nuevo, que no lo ayudará en el dominio predeterminado .

Si el conjunto que desea cargar se encuentra en un directorio por debajo de la corriente AppBase entonces usted puede agregar su ruta relativa utilizando el AppendPrivatePath (relativePath) y, a continuación, utilizar Assembly.Load - el tiempo de ejecución probará los subdirectorios para tú. Esta es la mejor/más fácil forma de manejarlo. .

+0

Gracias, solo como una nota, no necesito cargarla dinámicamente. Me refiero al montaje en mi proyecto. Pero cuando despliego esa aplicación, quiero que la aplicación sepa que el ensamblado al que se hace referencia estará en la carpeta temporal –

Cuestiones relacionadas