2012-01-17 15 views
19

Tengo una solución con dos proyectos ejecutables.App.config para el proyecto secundario no copiado en la salida

Main.exe depende de Subordinate.exe.

Estos proyectos tienen archivos App.config, así que en sus respectivos directorios de salida, tengo Main.exe.config y Subordinate.exe.config.

Cuando construyo Main.exe, Subordinate.exe se copia en el directorio de salida de Main, pero Subordinate.exe.config no lo está.

¿Hay alguna manera estándar de decirle a Visual Studio que haga esto?

+2

Un enfoque alternativo es editar el archivo csproj para el proyecto principal y utilizar los AllowedReferenceRelatedFileExtensions en un propertyGroup. En su caso, debería agregar .exe.config a la lista de extensiones permitidas. Ver: https://stackoverflow.com/questions/9765686/include-referenced-projects-config-file/9769667#9769667 –

Respuesta

10

Haga clic con el botón derecho en el proyecto Main y seleccione Edit Project File. Añadir un evento AfterBuild:

<Target Name="AfterBuild"> 
    <Copy SourceFiles="..\Subordinate\bin\$(Configuration)\Subordinate.exe.config" 
      DestinationFolder="$(TargetDir)" /> 
    </Target> 
+0

Ya había intentado esto, usando 'PostBuildEvent', y encontré que estaba fallando en el primer intento de compilación , luego teniendo éxito en el segundo intento. Resulta que en mi proyecto * real *, el proyecto subordinado no figuraba como una dependencia del proyecto principal, por lo que se creó después del proyecto principal. Una vez que establecí la dependencia correctamente, funcionó el evento post build.** - ** De todos modos, esperaba una respuesta que no requiriera AfterBuild/PostBuildEvent, pero dado que no hay ninguna disponible, estoy marcando esto como la respuesta (ya que es lo que hice). – Mud

+1

Evitaría 'PostBuildEvent' a toda costa. 'AfterBuild' es preferible, ya que al menos está controlado y controlado. – KMoraz

+0

Me gustaría agregar que en VS2012, la macro para la configuración (por ejemplo, Depuración/Versión) es $ (ConfigurationName), no $ (Configuración). Además, es posible que deba incluir una especificación de plataforma (por ejemplo, x86/x64). Usted puede terminar necesidad de escribir se siente: AfterBuild

14

Otra manera que he encontrado es añadiendo el archivo app.config como un archivo vinculado al proyecto depende, por ejemplo, aquí debería agregar un enlace a la app.config de Subordinate.exe en el proyecto de Main.exe y configurarlo para que se copie en el directorio de salida cuando se construya. A continuación, puede cambiar el nombre del archivo que se copia en el directorio de salida de Main.exe en tiempo de compilación editando el elemento <Link> del archivo de proyecto, algo así como:

<None Include="..\Subordinate.ProjectFolder\app.config"> 
    <Link>Subordinate.exe.config</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</None> 

Esto tiene el mismo problema que usted tiene que codifique el nombre del archivo de configuración generado, pero eso no es peor que el enfoque AfterBuild, y este método me parece un poco más transparente, y elimina el problema de dependencia de orden de compilación que mencionó.

+1

¿Hay alguna manera de hacer que el archivo aparezca con el mismo nombre que con el enlace? – Zee

+0

La mejor solución, ya que la solución aceptada no funciona en los escenarios de Build Server :) – suryakiran

1

Eche un vistazo a this answer (basado en el trabajo de @theyetiman). Requiere principalmente una modificación del proyecto, el archivo app.config pertenece. Los proyectos que consumen no se modifican.

<ItemGroup> 
    <None Include="app.config" /> 
</ItemGroup> 
<ItemGroup> 
    <None Include="app.config"> 
    <Link>$(TargetFileName).config</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
</ItemGroup> 

También tenga en cuenta que con Visual Studio 2017 esta modificación ya no es necesaria. Si abre una solución con un proyecto que contiene la solución anterior, aparece una advertencia similar a la siguiente en la ventana de errores:

El archivo 'app.config' no se pudo agregar al proyecto. No se puede agregar un enlace al archivo ... \ app.config. Este archivo está dentro del árbol de directorios del proyecto.

agregar una condición comparando $(VisualStudioVersion) para evitar esta advertencia y mantener la compatibilidad hacia atrás:

<ItemGroup> 
    <None Include="app.config" /> 
</ItemGroup> 
<ItemGroup Condition="'$(VisualStudioVersion)' &lt; '15.0'"> 
    <None Include="app.config"> 
    <Link>$(TargetFileName).config</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
</ItemGroup> 
Cuestiones relacionadas