Winforms 我可以强制安装程序项目使用内置解决方案中的.config文件而不是原始解决方案中的.config文件吗?

Winforms 我可以强制安装程序项目使用内置解决方案中的.config文件而不是原始解决方案中的.config文件吗?,winforms,visual-studio-2010,installation,web-config-transform,Winforms,Visual Studio 2010,Installation,Web Config Transform,我正在使用解决方案来将配置更改应用到Winforms项目中的App.config。我还有一个用于创建可安装的*.msi文件的项目的安装程序项目。问题是,安装程序中捆绑的配置文件是原始的、未转换的配置文件。因此,即使构建的winforms项目的配置文件应用了所有正确的转换,我们也无法在生产安装程序中获得生产连接字符串 有没有办法强制安装程序项目使用project build的输出?首先:使用主输出选项无法使安装项目指向另一个app.config文件。因此,我的解决方案将是一种变通方法。我希望它对你

我正在使用解决方案来将配置更改应用到Winforms项目中的
App.config
。我还有一个用于创建可安装的*.msi文件的项目的安装程序项目。问题是,安装程序中捆绑的配置文件是原始的、未转换的配置文件。因此,即使构建的winforms项目的配置文件应用了所有正确的转换,我们也无法在生产安装程序中获得生产连接字符串


有没有办法强制安装程序项目使用project build的输出?

首先:使用
主输出
选项无法使安装项目指向另一个
app.config
文件。因此,我的解决方案将是一种变通方法。我希望它对你的情况有用

概述:

基本思想是:

  • 从安装项目中删除强制的
    app.config
  • 手动添加指向
    app.config
    的文件
  • 使用MSBuild进入
    vdproj
    文件,并将其更改为与转换后的app.config的实际输出相匹配
一些缺点是:

  • 安装项目仅在其部署的项目生成时更新。啊。。。这不是真正的缺点
  • 您需要MSBuild 4.0。。。这也可以解决
  • 需要一个名为FileUpdate的自定义任务。。。它是开源的,有安装程序
让我们一起工作:

1) 转到安装项目,选择主输出对象,右键单击并转到属性。您将在那里找到
排除过滤器
。。。为
*.config
添加一个过滤器,这样它将删除硬编码的app.config

2) 右键单击解决方案资源管理器中的安装项目->添加->文件。。。选择以
.config
结尾的任何文件

3) 下载,我推荐msi安装程序

4) 卸载您的项目(csproj)并用以下问题替换另一个问题中的代码:

代码:


有关在MSBuild中使用函数的详细信息

我在另一个问题中了解到了。官方项目是

这两个主题对我的发现很重要:


我发现的另一个解决方案是不使用转换,而是使用一个单独的配置文件,例如app.Release.config。然后将这一行添加到csproj文件中

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

App.Release.config

这将迫使部署项目在打包时使用正确的配置文件。

根据Alec的回答,这里有一个类似的元素,您可以与转换一起使用,并且仍然可以获得它们的全部好处:

  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <Content Include="$(OutputPath)$(AssemblyName).dll.config">
      <InProject>false</InProject>
      <Link>$(AssemblyName).dll.config</Link>
    </Content>
  </ItemGroup>

假的
$(AssemblyName).dll.config

通过这种方式,您可以使用SlowCheetah转换或内置转换来转换.config文件,然后进入Visual Studio部署项目(或其他项目),并将受影响项目的内容包括在“添加->项目输出”中。。。在部署/设置项目中,上述解决方案或任何文章都不适合我。花了很多天来找出正确的解决方案。最后,这种方法对我起了作用

先决条件

我使用了名为cct.exe的实用程序来显式转换文件。你可以从这里下载

我在安装项目中使用了自定义安装程序来捕获安装事件

按照以下步骤实现应用程序配置转换

1) 将所需的配置文件添加到项目中,并修改.csproj文件,如下所示

<Content Include="app.uat.config">
  <DependentUpon>app.config</DependentUpon>
</Content>
<Content Include="app.training.config">
  <DependentUpon>app.config</DependentUpon>
</Content>
<Content Include="app.live.config">
  <DependentUpon>app.config</DependentUpon>
</Content> 
这里我使用两个事件处理程序CustomInstaller\u AfterInstall,在其中加载正确的配置文件并进行转换。 在MyInstaller\u Committed中,我正在删除应用后客户端计算机上不需要的转换文件。我还缩进转换后的文件,因为cct只是转换对齐的元素

4) 打开安装程序项目并添加项目输出内容文件,以便安装程序可以将app.uat.config、app.live.config等配置文件复制到客户端计算机中

在前面的步骤中,这个代码段将加载所有可用的配置文件,但我们需要提供正确的转换文件

 string[] transformationfiles = Directory.GetFiles(Path.GetDirectoryNam

 (Assembly.GetExecutingAssembly().Location), "app.*.config");
为此,我在安装项目上添加了UI对话框,以获取当前配置。该对话框为用户提供选择环境的选项,如“实时”“UAT”“测试”等。 现在将所选环境传递给自定义安装程序并对其进行筛选

如果我解释如何添加对话框,如何设置参数等,这将成为一篇冗长的文章,所以请用谷歌搜索它们。但想法是改变用户选择的环境。 这种方法的优点是可以对任何环境使用相同的设置文件

总结如下:

添加配置文件

添加cct exe文件

添加自定义安装程序

在安装后事件下对exe.config应用转换

从客户端计算机删除转换文件

修改安装项目时,请确保

set up should copy all config files(project output content) and cct.exe into output directory

configure UI dialog with radio buttons (Test,Live,UAT..)

pass the selected value to custom installer

解决方案可能看起来很长,但别无选择,因为MSI总是复制app.config,并且不关心项目构建事件和转换。slowcheetah仅适用于clickonce而不适用于设置项目

我以不同的方式完成了这项工作,无需外部工具:

我添加了一个生成后事件,该事件将目标文件复制到“中立”目录(项目中/bin文件夹的根目录),然后将该文件添加到.vdproj。部署项目现在会选择最新的构建版本:

生成后命令:

copy /y "$(TargetDir)$(TargetFileName).config" "$(ProjectDir)bin\$(TargetFileName).config"

这在没有任何外部工具的情况下满足了我的需要,并且与SlowCheetah转换配合得很好
set up should copy all config files(project output content) and cct.exe into output directory

configure UI dialog with radio buttons (Test,Live,UAT..)

pass the selected value to custom installer
copy /y "$(TargetDir)$(TargetFileName).config" "$(ProjectDir)bin\$(TargetFileName).config"
<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
  <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
  <ItemGroup>
    <AppConfigWithTargetPath Remove="app.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
  </ItemGroup>
</Target>
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!-- transformations here-->
</configuration>
copy /y "$(TargetDir)$(TargetFileName).config" "$(ProjectDir)bin\$(TargetFileName).config"