Respuestas:
Utilice una acción posterior a la compilación en su proyecto y agregue los comandos para copiar la DLL infractora. La acción posterior a la compilación se escribe como un script por lotes.
Se puede hacer referencia al directorio de salida como $(OutDir)
. El directorio del proyecto está disponible como $(ProjDir)
. Intente usar parches relativos cuando corresponda, de modo que pueda copiar o mover la carpeta de su proyecto sin interrumpir la acción posterior a la compilación.
$ (OutDir) resultó ser una ruta relativa en VS2013, así que tuve que combinarlo con $ (ProjectDir) para lograr el efecto deseado:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
Por cierto, puede depurar fácilmente los scripts agregando 'echo' al principio y observar el texto expandido en la ventana de salida de la compilación.
Los detalles en la sección de comentarios anterior no funcionaron para mí (VS 2013) al intentar copiar la dll de salida de un proyecto C ++ a la carpeta de lanzamiento y depuración de otro proyecto C # dentro de la misma solución.
Tuve que agregar la siguiente acción de compilación posterior (haga clic derecho en el proyecto que tiene una salida .dll) luego propiedades -> propiedades de configuración -> eventos de compilación -> evento posterior a la compilación -> línea de comando
ahora agregué estas dos líneas para copiar el dll de salida en las dos carpetas:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(Esta respuesta solo se aplica a C #, no a C ++, lo siento, leí mal la pregunta original)
He pasado por un infierno DLL como este antes. Mi solución final fue almacenar las DLL no administradas en la DLL administrada como recursos binarios y extraerlas a una carpeta temporal cuando se inicia el programa y eliminarlas cuando se desecha.
Esto debería ser parte de la infraestructura .NET o pinvoke, ya que es muy útil ... Hace que su DLL administrado sea fácil de administrar, tanto usando Xcopy como como referencia de proyecto en una solución de Visual Studio más grande. Una vez que haga esto, no tendrá que preocuparse por los eventos posteriores a la compilación.
ACTUALIZAR:
Publiqué el código aquí en otra respuesta https://stackoverflow.com/a/11038376/364818
Agregue COPY incorporado en el archivo project.csproj :
<Project>
...
<Target Name="AfterBuild">
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
</Target>
</Project>
xcopy /y /d "$(ProjectDir)External\*.dll" "$(TargetDir)"
También puede hacer referencia a una ruta relativa, el siguiente ejemplo encontrará la DLL en una carpeta ubicada un nivel por encima de la carpeta del proyecto. Si tiene varios proyectos que usan la DLL en una única solución, esto coloca la fuente de la DLL en un área común accesible cuando configura cualquiera de ellos como Proyecto de inicio.
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
La /y
opción copia sin confirmación. La /d
opción comprueba si existe un archivo en el destino y si lo hace, solo se copia si el origen tiene una marca de tiempo más reciente que el destino.
Descubrí que al menos en las versiones más recientes de Visual Studio, como VS2109, $(ProjDir)
no está definido y tuve que usarlo $(ProjectDir)
en su lugar.
Dejar una carpeta de destino en xcopy
debería ser el directorio de salida predeterminado. Eso es importante para entender que la razón por $(OutDir)
sí sola no es útil.
$(OutDir)
, al menos en versiones recientes de Visual Studio, se define como una ruta relativa a la carpeta de salida, como bin/x86/Debug
. Si lo usa solo como destino, se creará un nuevo conjunto de carpetas a partir de la carpeta de salida del proyecto. Ej … bin/x86/Debug/bin/x86/Debug
. : .
Combinarlo con la carpeta del proyecto debería llevarlo al lugar adecuado. Ex:$(ProjectDir)$(OutDir)
. .
sin embargo $(TargetDir)
, proporcionará el directorio de salida en un solo paso.
Lista de Microsoft de macros de MSBuild para versiones actuales y anteriores de Visual Studio