2009-04-23 17 views
7

Digamos que tiene un proyecto de biblioteca de clase que tiene cualquier cantidad de archivos complementarios que también deben incluirse con el ensamblado compilado (por ejemplo, archivos de texto simples o incluso un archivo DLL no administrado heredado). el conjunto como una capa de interoperabilidad). Mientras que incrustar los archivos suplementarios en el ensamblaje es relatively straightforward, tenemos situaciones donde esto no es posible o simplemente no es deseable. Necesitamos tenerlos como archivos "sidecar" (es decir, archivos junto al ensamblaje, potencialmente en subdirectorios relativos al ensamblaje)Cómo asociar archivos externos con un ensamblaje

Agregando esos archivos al proyecto con un valor apropiado para "Copiar al directorio de salida" especificado parece ser suficiente para proyectos que son completamente autónomos dentro de una solución. Pero si un proyecto separado en otra solución agrega una referencia al ensamblaje, no recoge automáticamente sus archivos sidecar. ¿Hay alguna manera en el proyecto de marcar de alguna manera el ensamblaje resultante de manera que cualquier cosa que haga referencia al ensamblado también sepa que necesita incluir los archivos sidecar asociados? ¿Cómo haces esto?

+0

Iba a sugerir "TFS Dependency Replicator" pero solo funciona para ensamblajes, no archivos sidecar .. – RobS

Respuesta

2

Puede usar al.exe, pero también parece haber una opción de compilador de C#. Desea crear un conjunto de múltiples utilizando la opción del compilador/linkresource C#. Las instrucciones son here, pero el comando es similar a esto:

csc /linkresource:N.dll /t:library A.cs 

Dónde N.dll es una DLL nativa que ir a donde el ensamblado administrado va (incluyendo en la GAC.) Hay una descripción muy clara en el enlace que proporcioné

+0

Leí los documentos vinculados y algunos otros que encontré relacionados con ensamblajes de varios archivos, pero todavía no estoy seguro de cómo esto puede ser aplicable a la respuesta a mi pregunta. ¿Puede editar su respuesta para incluir más detalles sobre cómo se podría utilizar para resolver el problema de, por ejemplo, un archivo DLL no administrado envuelto por un ensamblado administrado que debe estar disponible en una ubicación de biblioteca común para su uso dentro de un nivel superior administrado aplicación que existe en una solución separada (puede hacer referencia fácilmente al contenedor administrado, pero eso no incluye automáticamente el archivo DLL no administrado en su directorio de salida)? – iammichael

+0

Gracias por la edición; esto parece que podría ser adecuado para resolver el problema. Sin embargo, dado que requeriría cambiar nuestro proceso de compilación desde compilaciones simples de estudios visuales a MSBuild u otra compilación basada en línea de comandos (los estados de referencia vinculados "Esta opción de compilador no está disponible en Visual Studio y no se puede cambiar mediante programación"), No puedo probar en este momento para verificar. Ciertamente parece prometedor sin embargo. – iammichael

+0

No he podido verificar, no anticipo el tiempo para hacerlo, y he terminado usando una copia manual menos que ideal para los archivos, pero esta parece ser la respuesta real a la pregunta, así que ' Estoy aceptando – iammichael

1

¿Ha intentado crear una configuración para su solución? Existe la opción de incluir archivos de sidecar dirigidos al directorio de instalación de la aplicación.

Otra opción sería incluir los archivos del sidecar en los recursos del ensamblado y desencajarlos en el disco cuando se ejecuten por primera vez.

+0

Con la frecuencia de los cambios en el código de la biblioteca que utiliza los archivos sidecar, nos gustaría evitar tener que instalar antes de que pueda ser utilizado por los desarrolladores de la aplicación. Además, el instalador de la aplicación (que debe incluir la biblioteca subyacente) no conocerá automáticamente los archivos del sidecar. Incluir los archivos de sidecar como recursos de ensamblado incrustados y luego desenvolverlos en el disco es una idea interesante que tendremos que examinar. Sin embargo, no estoy seguro de que cubra todos nuestros casos de uso. – iammichael

+0

De hecho, tuvimos éxito en el desenvolvimiento del tiempo de ejecución de los dlls de Interop y otros recursos. Solucionamos el problema de 'resolución de ensamblaje por camino' usando esto. Independientemente del dominio de aplicación o el proceso de host desde el que ejecute el ensamblaje, los desenrollará dinámicamente en el disco durante el tiempo de ejecución y resolveremos la referencia a los ensamblajes desplegados recientemente. Esto también se encontró útil en la distribución de actualizaciones de aplicaciones. –

+1

¿Se encontró con algún problema de permisos con el usuario ejecutor que no puede escribir la DLL de interoperabilidad en el disco? – iammichael

0

Desafortunadamente, no parece haber una gran cantidad de soporte integrado en Visual Studio para esto, aunque definitivamente puedo ver el caso de uso.

Si usa Subversion para su control de origen, entonces podría vincular en una referencia externa como una definición externa. Esto generaría el código fuente, y estaría haciendo una referencia al ensamblado necesario como referencia de proyecto en lugar de una referencia de DLL, y luego entrarían en juego las reglas de copia a directorio de salida.

Si eso no es posible, otra solución sería incluir comandos en los eventos pre/post-build de su proyecto en solución para copiar los archivos sidecar más actualizados del ensamblaje remoto en una compilación. Por supuesto, esto viene con la advertencia de que no se configura automáticamente cuando se incluye la DLL en su proyecto; tienes que tomar pasos manuales para configurarlo.

+0

Estamos usando TFS, no subversión, y aún así no estoy seguro de que resuelva el problema, ya que la aplicación que hace referencia a la biblioteca no debería necesitar conocer los archivos individuales del sidecar (que creo que sería necesario si está interesado). agregándolos como referencias de proyectos según su descripción). Sin embargo, es posible que esté malinterpretando lo que estás diciendo aquí. En cuanto a los eventos de compilación pre/post, la falta de automatización es una especie de factor decisivo. Ver también mi comentario a Lucas quien también sugirió eventos previos y posteriores a la construcción. – iammichael

+0

Si estaba utilizando algún tipo de definición externa, es como incluir una copia virtual del proyecto incluido en su solución. Luego, para cada archivo de sidecar en el proyecto incluido, puede configurar el atributo "Copiar en el directorio de salida" en el editor de propiedades de Visual Studio para copiar siempre.Cuando hace esto, e incluye el proyecto por referencia de proyecto, y crea la solución, Visual Studio sabe copiar los archivos del sidecar en el directorio primario de salida. –

0

Trato esto hace algún tiempo. Es un problema común.

Usted puede crear algunas acciones postbuild:

http://www.codingday.com/execute-batch-commands-before-or-after-compilation-using-pre-build-or-post-build-events/

Espero que esto ayude ... :)

+0

Las acciones posteriores a la compilación en la biblioteca requerirían que su conjunto de bibliotecas conociera las aplicaciones que dependen de él y, por lo tanto, dónde se necesitan los archivos adicionales. Las acciones previas a la creación en la aplicación según la biblioteca significan que la aplicación necesita saber qué copiar y que la biblioteca solo conoce esa información. Las cosas se complican aún más si la cadena de dependencia es más larga con múltiples capas de bibliotecas que necesitan saber acerca de los archivos sidecar que deben copiarse manualmente. Entonces, esto no satisface completamente la necesidad. – iammichael

0

Me parece que está utilizando el tipo incorrecto de referencia. Hay dos tipos de referencias: referencia y referencia de proyecto. La referencia es una referencia explícita a un ensamblaje específico. ProjectReference es una referencia a otro proyecto (digamos .csproj).

Lo que estás buscando es ProjectReference. VS y los objetivos predeterminados de MSBuild están configurados para hacer CopyLocal. Si configura CopyToOutputPath como verdadero para sus archivos "sidecar", cualquier ProjectReferences para este proyecto ahora también extraerá los mismos archivos.

No estoy seguro si puede ProjectReferences a través de las soluciones en el IDE. Trato mucho con MSBuild, donde los archivos sln no son relevantes y así es como me ocupo de ellos.

+0

Sí, si todo está dentro de una solución, hacer referencia al proyecto funciona bien. De alguna manera lo insinué en la pregunta. No funciona con soluciones separadas, ni es probable que funcione si el archivo de proyecto de la biblioteca no está disponible (es decir, si los desarrolladores de la aplicación solo tienen el ensamblaje más los archivos sidecar y no el archivo del proyecto real) – iammichael

0

Lo que hicimos en nuestro proyecto es que creamos un archivo de construcción separado para hacer todas esas cosas.

En su archivo de compilación puede tener etiquetas para compilar su solución principal, y luego agregar etiquetas para copiar los archivos que necesita después de la compilación.

NAnt también es su opción, pero ahora estoy contento de usar Rake como mi automatización de compilación/depuración.

Como esto no puede integrarse en Visual Studio, lo que hago es crear una tarea (ya sea en MSBuild, NAnt o Rake), que ejecuta vsjitdebugger.exe al final para adjuntarla a mi Visual Studio cuando se depura .

Estos son solo mis estilos por ahora, quizás puedas crear tu propio estilo.

1

¿Qué ocurre si crea un merge module que contiene la biblioteca más sus dependencias? Su instalador deberá hacer referencia a este módulo, pero se asegurará de que todos los archivos necesarios estén presentes.

+0

Esto suena como si hubiera funcionan en algunas situaciones, pero actualmente no estamos utilizando instaladores ni para nuestros componentes de biblioteca ni para nuestras aplicaciones de sitio web, por lo que esto agregaría una gran cantidad de sobrecarga tanto para nuestro proceso de implementación como, lo que es más importante, para el proceso de desarrollo. – iammichael

1

He encontrado una mucho mejor solution que hace que sea muy simple utilizar linkresource y copiar referencias.

Cuestiones relacionadas