2011-02-09 23 views
7

Tengo una solución con múltiples proyectos que todos los dlls de salida (a excepción de la aplicación principal, por supuesto). Copy local se establece en true para todas las referencias y todo está bien y dandy con dlls en el mismo directorio que el exe.Colocando C# Referencias del proyecto en una subcarpeta

Mi problema es que esto es feo. Me gustaría poner todos los dll en una subcarpeta (en realidad dos subcarpetas para ser precisos). ¿Cómo puedo hacer esto en Visual Studio 2008?

He encontrado algunas preguntas que parecen similares pero no he podido encontrar la respuesta simple que sé que tiene que existir.

EDITAR: Para ser más claro, quiero saber cómo hacer que el cargador de ensamblaje busque referencias en algún lugar además del directorio operativo. Los usuarios interactuarán con algunos de los otros archivos en el directorio, y cuanto menos desorden haya para ellos, mejor.

EDIT 2: También quiero evitar usar el GAC. La aplicación debe ser independiente.

+0

¿Pero cómo se cargarán? Tendrá que cargar cada DLL manualmente, eso solo apesta. Y si lo hizo, no hace referencia a los proyectos, simplemente no podría usar los tipos en ellos. Exceso total y explosión cerebral. –

+0

Lo ideal es que VS permita que la aplicación busque todas las dependencias en algún lugar además del directorio operativo. No me puedo imaginar que sea tan difícil. – daedalus28

Respuesta

2

O AssemblyResolve

public static class AssemblyResolver { 
    static AssemblyResolver() { 
     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(delegate(object sender, ResolveEventArgs args) { 
      return Assembly.LoadFrom(...); 
     }); 
    } 
} 
+0

ah en realidad esta es la forma no obsoleta de hacerlo :) – daedalus28

0

No puede poner esas referencias en una subcarpeta. Dado que no serán "vistos" por el tiempo de ejecución de su aplicación.

El primer lugar para colocarlos está en su directorio de depuración y luego en la Caché de ensamblados global (también conocida como GAC). Tenga en cuenta que lo que ve en la pestaña (.Net) en el cuadro de diálogo Add Reference es en realidad las referencias en el directorio GAC.

Nota: Si utiliza TFS como control de origen back-end, tenga en cuenta que las referencias no se copian en el repositorio de control de origen cuando realiza un check-in, sino que debe copiarlas manualmente.

4

¿Has probado el espacio de nombres AppDomain?

AppDomain.CurrentDomain.AppendPrivatePath

http://www.vcskicks.com/csharp_assembly.php

+0

¡Esto funcionó maravillosamente! – daedalus28

+0

Solo un problema: Visual Studio advierte que está en desuso. ¿Algún consejo sobre el uso de la nueva alternativa? Tal como está, la aplicación se está ejecutando muy bien – daedalus28

+0

PrivateBinPath? – djeeg

0

acabo de publicar un artículo que explica todo esto con más detalles. Partitioning Your Code Base Through .NET Assemblies and Visual Studio Project

Estas son las orientaciones que se derivan del artículo:

  • reducir drásticamente el número de conjuntos de su base de código.
  • Cree un ensamblaje nuevo solo cuando esté justificado por un requisito específico de separación física.
  • En un proyecto de Visual Studio, use 'referencia por ensamblado' en lugar de 'referencia por proyecto de Visual Studio'.
  • Nunca use la opción de referencia de Visual Studio 'Copy Local = True'.
  • Coloque todas las soluciones VS y los archivos Build Build .bat en un directorio $ rootDir $.
  • Compila todos los ensamblados en los directorios: $ rootDir $ \ bin \ Debug y $ rootDir $ \ bin \ Release
  • Usa el directorio $ rootDir $ \ bin para alojar conjuntos de pruebas.
1

Utilice la aplicación.config <probing> elemento para indicarle a .NET Runtime que busque en las subcarpetas los ensamblados adicionales. Ver here.

Cuestiones relacionadas