usar - Copiando las dependencias de una DLL en Visual Studio
visual studio code close tags (8)
¿Cómo puedo configurar un proyecto en Visual Studio para copiar los archivos DLL de terceros de los que depende una de las referencias del proyecto?
Tengo un proyecto de aplicación principal y una biblioteca de clase DLL. La aplicación principal hace referencia a la DLL de la biblioteca de clases y la DLL hace referencia a algunas DLL de terceros. Cuando compilo la aplicación principal, copia automáticamente la DLL de la biblioteca de clases en su directorio de salida, pero no copia las DLL de terceros.
No deseo agregar referencias a las DLL de terceros desde el proyecto de la aplicación principal porque la aplicación principal no las usa, solo las usa la biblioteca de la clase.
100% seguro de que esto funcionará. Simplemente reemplace dll con su ref. Personal. archivo
<Reference Include="Xceed.Wpf.Toolkit">
<HintPath>../../../3rdParty/Extended WPF Toolkit-2.2.1/Xceed.Wpf.Toolkit.dll</HintPath>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Content Include="../../../3rdParty/Extended WPF Toolkit-2.2.1/Xceed.Wpf.Toolkit.dll">
<Link>Xceed.Wpf.Toolkit.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SpecificVersion>False</SpecificVersion>
</Content>
Eche un vistazo a esta solución proporcionada por Alex Yakunin http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html Me funcionó muy bien - el escenario que las bibliotecas DevExpress usaban expresamente tenía otras dependencias que causaron problemas cuando se implementaron)
- Nota 1: Visual Studio 2010 parece agregar dlls referenciadas automáticamente, sin embargo, msbuild no lo hizo. Así que la solución de Alex funcionó ya que los scripts de lanzamiento usaban msbuild.
- Nota 2: También tenía que asegurarse de que para las bibliotecas referenciadas (aquellas a las que se hacía referencia en el código) copy-local realmente se configurara en True en el csproj, aunque Solution Explorer dijo que sí. La mejor manera es establecer copy-local = False, Save, set copy-local = True, Save.
Estos dos pasos - copy-local = true para bibliotecas referenciadas y la adición de objetivos msbuild para las referencias indirectas automatizaron la configuración de compilación para mí.
El siguiente fragmento me funciona:
<Project>
...
<ItemGroup>
<Content Include="Path/to/dll/dllname.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
...
</Project>
Esto funciona para C #. Para C ++ nativo todavía copia dll a la carpeta de salida, pero esta dependencia no está visible en Visual Studio, debe editarse directamente en el archivo del proyecto.
Para probar un ejemplo no trivial, intenté ejecutar el proyecto A de C #, que depende del proyecto B de C ++ nativo. Los proyectos B dependen de la DLL nativa de terceros. Esta dependencia se implementa a través del fragmento anterior en el archivo del proyecto. Cuando construyo A, C se copia a la carpeta binaria.
Lo probé en Visual Studio 2010.
No estoy realmente enterado de ninguna otra forma de hacer esto que no sea agregar una referencia a dicho .dll en el proyecto mismo. Hemos encontrado esto en algunos de nuestros proyectos aquí, y la única solución que hemos encontrado es agregar la referencia. Quiero decir que uno de nuestros desarrolladores hizo una investigación y descubrió que esta es la única solución, pero no me cites sobre eso.
No me gusta tener mis archivos de dependencia ubicados en la carpeta raíz del proyecto, sino en una subcarpeta. Pero los archivos deben colocarse en la carpeta raíz en la carpeta de compilación.
Mis eventos de compilación se ven así:
Command: call xcopy /S /Y "$(SolutionDir)Dependencies/*.*" "$(TargetDir)"
En caso de que "Dependencias" también contenga subcarpetas, como la mía lo hace.
No recomendaría hacer esto. Usted termina con una explosión de N ^ 2 en la cantidad de ensamblajes que se están copiando (y, potencialmente, en reconstrucción). Si es posible, debe hacer que todos sus proyectos coloquen sus ensamblajes en el mismo $ (OutDir). Si usa TFS, Team Build lo hace por usted.
Puede lograr esto con la ventana de propiedades del proyecto. Visual Studio le permite definir eventos para que ocurran, antes o después de la construcción. Para acceder a la ventana de propiedades del proyecto, simplemente haga clic derecho en su proyecto en la ventana del explorador de soluciones y haga clic en ''propiedades''. Desde el lado izquierdo ve a la pestaña ''generar eventos''.
En el cuadro posterior a la creación, escriba algunos comandos de copia. Por ejemplo:
copy "$(SolutionDir)mydll.dll" "$(TargetDir)"
Donde $(SolutionDir)
y $(TargetDir)
son ambas variables predefinidas. La sintaxis estándar es la siguiente:
copy "source directory and file name" "destination directory"
Si hace clic en el botón "editar publicación posterior ..." aparecerá un cuadro con una lista de estas variables predefinidas que puede insertar (como $(SolutionDir)
y $(TargetDir)
)
Como nota al margen, este es un proceso útil para copiar otros archivos, como archivos de configuración personalizada, imágenes o cualquier otra dependencia que pueda tener su proyecto.
Vaya a la aplicación principal, referencias, a su referencia de biblioteca de clase.
Establezca "Copiar local" a True.
Ahora copiará el directorio bin de su biblioteca de clases en el directorio principal bin de la aplicación. Incluyendo cualquier dlls de terceros de dependencias.