Winforms 我可以强制安装程序项目使用内置解决方案中的.config文件而不是原始解决方案中的.config文件吗?
我正在使用解决方案来将配置更改应用到Winforms项目中的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文件。因此,我的解决方案将是一种变通方法。我希望它对你
App.config
。我还有一个用于创建可安装的*.msi文件的项目的安装程序项目。问题是,安装程序中捆绑的配置文件是原始的、未转换的配置文件。因此,即使构建的winforms项目的配置文件应用了所有正确的转换,我们也无法在生产安装程序中获得生产连接字符串
有没有办法强制安装程序项目使用project build的输出?首先:使用
主输出
选项无法使安装项目指向另一个app.config
文件。因此,我的解决方案将是一种变通方法。我希望它对你的情况有用
概述:
基本思想是:
- 从安装项目中删除强制的
李>app.config
- 手动添加指向
的文件李>app.config
- 使用MSBuild进入
文件,并将其更改为与转换后的app.config的实际输出相匹配vdproj
- 安装项目仅在其部署的项目生成时更新。啊。。。这不是真正的缺点李>
- 您需要MSBuild 4.0。。。这也可以解决李>
- 需要一个名为FileUpdate的自定义任务。。。它是开源的,有安装程序
排除过滤器
。。。为*.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"