Trasformazione App.Config per progetti che non sono progetti Web in Visual Studio?


546

Per l'applicazione basata su Web di Visual Studio 2010 sono disponibili funzionalità di trasformazione della configurazione con cui è possibile gestire più file di configurazione per ambienti diversi. Ma la stessa funzione non è disponibile per i file App.Config per Windows Services / WinForms o Applicazione console.

È disponibile una soluzione alternativa come suggerito qui: Applicazione della magia XDT su App.Config .

Tuttavia non è semplice e richiede una serie di passaggi. Esiste un modo più semplice per ottenere lo stesso per i file app.config?


Mi sono imbattuto nel seguente articolo che sembra un po 'più semplice ma non l'ho provato da solo. fknut.blogspot.com/2009/11/… Inoltre, esiste una richiesta di funzionalità su MS Connect che potrebbe valere la pena di votare, in modo da essere inclusa su tutta la linea nel prossimo SP o versione. connect.microsoft.com/VisualStudio/feedback/details/564414
Kim R

Risposte:


413

Funziona ora con il componente aggiuntivo di Visual Studio trattato in questo articolo: SlowCheetah - Sintassi di trasformazione Web.config ora generalizzata per qualsiasi file di configurazione XML .

È possibile fare clic con il tasto destro del mouse su web.config e fare clic su "Aggiungi trasformazioni di configurazione". Quando lo fai, otterrai un web.debug.config e un web.release.config. Se lo desideri, puoi creare un web.whatever.config, purché il nome sia allineato con un profilo di configurazione. Questi file sono solo le modifiche che vuoi apportare, non una copia completa di web.config.

Potresti pensare di voler usare XSLT per trasformare un web.config, ma mentre si sentono intuitivamente bene, in realtà è molto dettagliato.

Ecco due trasformazioni, una che utilizza XSLT e la stessa che utilizza la sintassi / lo spazio dei nomi di XML Document Transform. Come per tutte le cose, in XSLT ci sono molti modi per farlo, ma ottieni l'idea generale. XSLT è un linguaggio di trasformazione dell'albero generalizzato, mentre questo linguaggio di distribuzione è ottimizzato per un sottoinsieme specifico di scenari comuni. Ma la parte interessante è che ogni trasformazione XDT è un plugin .NET, quindi puoi crearne uno tuo.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

O la stessa cosa tramite la trasformazione di distribuzione:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>

Oh, è dolce! Avere un'app con numerosi file di configurazione (log4net, nHibernate, web.config) e ricordarsi di cambiarli tutti è stato un po 'una seccatura. Non vedevo l'ora di spostare il codice in CruiseControl.NET, ma sembra che anche questo sia un gioco da ragazzi.
DilbertDave,

10
Cordiali saluti, SlowCheetah è stata una fantastica estensione che non sarà più supportata dopo VS 2014. Per l'autore, Sayed Ibrahim Hashimi, sedodream.com/2014/08/11/… .
bdeem,

5
@andrewb, l'ho letto qui ; tuttavia, è stato un anno fa. Dopo aver rivisitato il thread e aver letto i commenti, sembra che qualcuno abbia fornito una versione che funziona con VS2015 qui .
Anil Natha,

2
Funziona perfettamente con Visual Studio 2017 e Visual STudio 2019
Guilherme de Jesus Santos

1
È qui ora
Hugo Freitas,

573

Ho provato diverse soluzioni ed ecco la più semplice che ho trovato personalmente.
Dan ha sottolineato nei commenti che il post originale appartiene a Oleg Sych - grazie, Oleg!

Ecco le istruzioni:

1. Aggiungere un file XML per ogni configurazione al progetto.

In genere avrai Debuge Releaseconfigurazioni quindi dai un nome ai tuoi file App.Debug.confige App.Release.config. Nel mio progetto, ho creato una configurazione per ogni tipo di ambiente, quindi potresti voler sperimentare.

2. Scaricare il progetto e aprire il file .csproj per la modifica

Visual Studio ti consente di modificare i file .csproj direttamente nell'editor: devi solo scaricare prima il progetto. Quindi fare clic con il tasto destro su di esso e selezionare Modifica <nome progetto> .csproj .

3. Associa i file App. *. Config a App.config principale

Trova la sezione del file di progetto che contiene tutto App.confige App.*.configriferimenti. Noterai che le loro azioni di costruzione sono impostate su None:

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

Innanzitutto, imposta l'azione di compilazione per tutti Content.
Quindi, fai in modo che tutti i file specifici della configurazione dipendano dal principale in App.configmodo che Visual Studio li raggruppi come fa con i file designer e code-behind.

Sostituisci XML sopra con quello sotto:

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4. Attiva trasformazioni magiche (necessario solo per le versioni di Visual Studio precedenti a VS2017 )

Alla fine del file dopo

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

e prima della finale

</Project>

inserisci il seguente XML:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

Ora puoi ricaricare il progetto, costruirlo e goderti le App.configtrasformazioni!

FYI

Assicurati che i tuoi App.*.configfile abbiano la giusta configurazione in questo modo:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

4
Grazie mille per questo! Una nota, se aggiungi i nuovi file .config al progetto dopo aver modificato csproj, verranno visualizzati raggruppati in App.config. Ne ho aggiunto uno prima di modificare csproj e alla fine ho finito con due collegamenti, uno raggruppato e uno solo.
Jeff Swensen,

8
Un problema con questo approccio è che quando guardi la scheda "Pubblica" nelle proprietà del progetto e fai clic sul pulsante "File dell'applicazione" ... noterai che app.config, app.Debug.config, app.Release.config sono costretti a essere distribuiti come parte del processo di pubblicazione. Certo, ottieni anche il file MyApp.exe.config corretto, ma non voglio che venga distribuito quel bagaglio extra. È necessario un modo per mantenere i file dell'app. *. Config nel progetto come <Nessuno> anziché <Content>.
Lee Grissom,

6
L'unico problema che questo lascia fuori per alcuni è la risposta originariamente presa da Oleg Sych che lascia fuori un pezzo chiave. Se nella tua singola app. (Env) .configs NON elenchi '<configuration xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform ">' e qualcosa come <appSettings xdt: Transform = "Replace"> o attributi che fanno cose simili sulle linee di impostazione, non funzionerà. Quest'ultima informazione è la chiave e una volta che l'ho aggiunta, poof ha iniziato a funzionare.
Djangojazz,

24
È possibile sostituire v10.0con v$(VisualStudioVersion)per assicurarsi che il progetto funzioni con tutte le versioni successive di VS.
Thibault D.

14
Si è verificato un errore Errore MSBuild MSB3021: impossibile copiare il file. Impossibile trovare il file 'obj \ Release \ ConsoleApp.exe' durante la compilazione. Quindi cambio un po 'la soluzione per riutilizzare la sezione <Target Name = "AfterBuild"> invece di creare un nuovo like nella soluzione
asidis

137

Un'altra soluzione che ho trovato NON è quella di utilizzare le trasformazioni ma di avere solo un file di configurazione separato, ad esempio app.Release.config. Quindi aggiungi questa linea al tuo file csproj.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

Ciò non solo genererà il file myprogram.exe.config corretto, ma se si utilizza il progetto di installazione e distribuzione in Visual Studio per generare MSI, forzerà il progetto di distribuzione a utilizzare il file di configurazione corretto durante il packaging.


6
Le indicibili meraviglie di MSBuild. Ora mi chiedo cos'altro è possibile. Btw. questo funziona anche per distribuzioni clickonce direttamente da VS (in contrasto con le risposte più votate).
Boris B.

4
Le modifiche possono diventare onerose e soggette a errori se le configurazioni contengono molte voci identiche a tutte le build. Affrontare un problema in questo momento in cui il .config di un ambiente ha perso un cambiamento, e ovviamente era la produzione.
Jeepwran,

1
Avere due copie del file di configurazione non è un problema, purché gli sviluppatori non siano quelli che lo gestiscono manualmente.
anIBMer,

1
Questo è bellissimo, funziona come un fascino! Ho incollato solo la <AppConfig>App.Release.config</AppConfig>linea all'interno della <PropertyGroupcondizione esistente per la Releaseconfigurazione e l'IDE ha mostrato una linea ondulata sotto la <AppConfig>linea ... dicendo che non era nello schema o qualcosa del genere, ma ho comunque salvato il file e ricaricato il file di progetto e fatto una build in Releaseconfigurazione e ha funzionato!
Shiva,

1
Con questo, perderai la funzionalità del designer delle impostazioni.
Ondřej,

33

Nella mia esperienza, le cose che devo rendere specifiche per l'ambiente sono cose come stringhe di connessione, impostazioni delle app e impostazioni spesso smpt. Il sistema di configurazione consente di specificare queste cose in file separati. Quindi puoi usarlo nel tuo app.config / web.config:

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

Quello che faccio di solito è mettere queste sezioni specifiche della configurazione in file separati, in una sottocartella chiamata ConfigFiles (dipende dalla radice della soluzione oa livello di progetto). Definisco un file per configurazione, ad esempio smtp.config.Debug e smtp.config.Release.

Quindi puoi definire un evento pre-build in questo modo:

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

Nello sviluppo del team, è possibile modificarlo ulteriormente includendo% COMPUTERNAME% e / o% USERNAME% nella convenzione.

Naturalmente, ciò implica che i file di destinazione (x.config) NON devono essere messi nel controllo del codice sorgente (poiché sono generati). Dovresti comunque aggiungerli al file di progetto e impostare la loro proprietà del tipo di output su 'copia sempre' o 'copia se più recente'.

Semplice, estensibile e funziona per tutti i tipi di progetti Visual Studio (console, winforms, wpf, web).


Ho esattamente la stessa configurazione che hai tu. Ma ho problemi a trasformare il file smtp. Riesci a comprendere l'originale e la trasformazione? Questi sono i miei: Il file di base: <?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp> La trasformazione:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="user@email.com" deliveryMethod="Network"> <network .../> </smtp>
jgarza,

Non sono sicuro di capire. In questa configurazione non trasformo nulla,
sto

Oh, non ho visto la parte della copia. Trasformo la configurazione invece di copiarla. Grazie comunque.
jgarza,

Mi piace questa soluzione. Un piccolo suggerimento: nell'esempio di copia sopra, gli argomenti di origine e destinazione per la copia devono essere racchiusi tra virgolette; altrimenti Pre-Build fallirà per le directory con spazio nel loro nome
vandre

32

Ispirato da Oleg e altri in questa domanda, ho preso la soluzione https://stackoverflow.com/a/5109530/2286801 un ulteriore passo avanti per consentire quanto segue.

  • Funziona con ClickOnce
  • Funziona con progetti di installazione e distribuzione in VS 2010
  • Funziona con VS2010, 2013, 2015 (non ha testato il 2012 anche se dovrebbe funzionare anche).
  • Funziona con Team Build. (È necessario installare A) Visual Studio o B) Microsoft.Web.Publishing.targets e Microsoft.Web.Publishing.Tasks.dll)

Questa soluzione funziona eseguendo la trasformazione app.config prima di fare riferimento per la prima volta a app.config nel processo MSBuild. Utilizza un file target esterno per una gestione più semplice su più progetti.

Istruzioni:

Passaggi simili all'altra soluzione. Ho citato ciò che rimane lo stesso e l'ho incluso per completezza e confronto più facile.

0. Aggiungi un nuovo file al tuo progetto chiamato AppConfigTransformation.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1. Aggiungere un file XML per ogni configurazione al progetto.

In genere, avrai le configurazioni di debug e rilascio, quindi dai un nome ai tuoi file App.Debug.config e App.Release.config. Nel mio progetto, ho creato una configurazione per ogni tipo di ambiente, quindi potresti voler sperimentare.

2. Scaricare il progetto e aprire il file .csproj per la modifica

Visual Studio ti consente di modificare .csproj direttamente nell'editor: devi solo scaricare prima il progetto. Quindi fai clic destro su di esso e seleziona Modifica .csproj.

3. Associa i file App. *. Config a App.config principale

Trova la sezione del file di progetto che contiene tutti i riferimenti App.config e App. *. Config e sostituisci come segue. Noterai che utilizziamo Nessuno invece di Contenuto.

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4. Attiva le trasformazioni magiche

Alla fine del file dopo

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

e prima della finale

</Project>

inserisci il seguente XML:

<Import Project="AppConfigTransformation.targets" />

Fatto!


1
Ho provato in VS Community 2015 RC e ignora il file app.Debug.config che ho.
Khainestar,

Ho usato con successo la risposta accettata su un progetto WinForms .. ma per qualche motivo sconcertante non ho potuto applicare la risposta accettata. a un altro progetto WinForms (tutti nella stessa soluzione). Questa risposta di @bdeem è la mia nuova fiera, poiché ha interagito correttamente con il mio progetto MSI, grazie mille!
bkwdesign,

Questo non sembra funzionare in VS 2015. Ho aggiornato VisualStudioVersion da 10 a 12 ma senza dadi. Qualche idea?
Sinaesthetic

@Sinaesthetic Puoi fornirci maggiori dettagli? VS 2015 Ultimate, Community, ecc. VB.NET, C #, Eventuali errori?
bdeem

VS2015 Enterprise. Nessun errore. Semplicemente non fa nulla.
Sinaesthetic

27

È possibile utilizzare un file di configurazione separato per configurazione, ad esempio app.Debug.config, app.Release.config e quindi utilizzare la variabile di configurazione nel file di progetto:

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

Ciò creerà quindi il file ProjectName.exe.config corretto in base alla configurazione in cui si sta creando.


Grazie, non ho usato il tuo esempio esatto per risolvere il problema che stavo riscontrando, ma il tuo esempio mi ha fatto riflettere e mi ha portato a un'altra soulution molto simile usando il task Copia.
jpierson

Ho provato questo sotto VS 2015 Community RC e lo costruisce, ma poi ignora il contenuto dell'app. *. Config Ho aggiunto.
Khainestar,

14

Ho scritto una piacevole estensione per automatizzare la trasformazione app.config come quella integrata nella trasformazione della configurazione del progetto di applicazione Web

Il più grande vantaggio di questa estensione è che non è necessario installarlo su tutte le macchine di compilazione


1
Estensione molto utile, soprattutto ora che Slow Cheetah sta entrando in modalità manutenzione e potrebbe non essere supportato in futuro.
Dthrasher,

Sì, la gente dovrebbe smettere di rallentare il ghepardo come soluzione per questo quando questa funzionalità è ora supportata dall'attività msbuild transformxml. Un architetto sw del mio team ha introdotto il lento ghepardo in modo troppo zelante per il nostro progetto e ha creato trasformazioni di debug, stage e rilascio di tutte le nostre configurazioni, molte delle quali non necessitavano di trasformazione. Inutile dire che nel momento in cui ha lasciato ho tirato fuori il ghepardo lento e ora usiamo solo una singola attività transformxml su web.config. Ahhhhh, semplicità. Per non dire che il ghepardo lento non ha avuto il suo tempo e il suo posto.
HarryTuttle,

5

Installa "Configuration Transform Tool" in Visual Studio dal Marketplace e riavvia VS. Sarai in grado di vedere la trasformazione dell'anteprima del menu anche per app.config.

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform


1
Funziona perfettamente e richiede pochissimo sforzo o pensiero. Molto apprezzato. Grazie. (la 'trasformazione dell'anteprima' non funziona, ma la 'aggiungi trasformazioni' funziona perfettamente senza problemi su VS 2017). Sembra anche di ricevere aggiornamenti spesso.
adudley,

1
grazie mille per la soluzione, dietro la scena, fa esattamente quello che Dan Abramov ha spiegato sopra, senza sporcarsi le mani
Mohammed Dawood Ansari

Questa è la soluzione definitiva. L'anteprima sembra funzionare bene con VS 2019.
Kyle Champion

1
Lo adoro, ma ho scoperto che non supportava altri file non app.config senza alcuna modifica di csproj. Comunque è comunque bello vedere l'anteprima.
Ian1971,

4

Quindi ho finito con un approccio leggermente diverso. Ho seguito i passaggi di Dan attraverso il passaggio 3, ma ho aggiunto un altro file: App.Base.Config. Questo file contiene le impostazioni di configurazione desiderate in ogni App.Config generato. Quindi uso BeforeBuild (con l'aggiunta di Yuri a TransformXml) per trasformare la configurazione corrente con la configurazione Base in App.config. Il processo di generazione utilizza quindi l'App.config trasformato normalmente. Tuttavia, una seccatura è che in un certo senso si desidera escludere App.config in continua evoluzione dal controllo del codice sorgente in seguito, ma gli altri file di configurazione ora dipendono da esso.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="App.Base.config" Transform="App.$(Configuration).config" Destination="App.config" />
  </Target>

3

Solo un piccolo miglioramento alla soluzione che sembra essere pubblicata ovunque ora:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • cioè, a meno che tu non abbia intenzione di rimanere con la tua attuale versione VS per sempre

Puoi spiegare per favore che rispondi un po 'o dare fonti per spiegarlo?
roydukkey,

4
Non sembra $(VisualStudioVersion)impostato quando si utilizza direttamente MSBuild.
Jeremy Smith,

Questo dovrebbe essere un commento a stackoverflow.com/a/5109530/2003763 (ho appena aggiunto le stesse informazioni di un commento lì)
Thibault D.

2

Ho creato un'altra alternativa a quella pubblicata da Vishal Joshi in cui l'obbligo di modificare l'azione di costruzione in Contenuto viene rimosso e implementato anche il supporto di base per la distribuzione ClickOnce. Dico di base, perché non l'ho testato a fondo ma dovrebbe funzionare nel tipico scenario di distribuzione ClickOnce.

La soluzione consiste in un singolo progetto MSBuild che una volta importato in un progetto di applicazione Windows esistente (* .csproj) estende il processo di compilazione per contemplare la trasformazione app.config.

Puoi leggere una spiegazione più dettagliata su Trasformazione XML di Visual Studio App.config e il file di progetto MSBuild può essere scaricato da GitHub .


1

Se si utilizza un TFS online (versione Cloud) e si desidera trasformare App.Config in un progetto, è possibile effettuare le seguenti operazioni senza installare strumenti aggiuntivi. Da VS => Scarica il progetto => Modifica file progetto => Vai alla fine del file e aggiungi quanto segue:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

AssemblyFile e Destination funzionano per uso locale e server TFS online (Cloud).


0

la soluzione proposta non funzionerà quando si fa riferimento a una libreria di classi con file di configurazione da un altro progetto (nel mio caso si trattava della libreria di progetti di lavoro di Azure). Non copierà il file trasformato corretto dalla objcartella alla bin\##configuration-name##cartella. Per farlo funzionare con modifiche minime, è necessario modificare l' AfterCompileobiettivo in BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.