gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:44:16 25 4
gpt4 key购买 nike

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

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

最佳答案

首先:不可能让Setup Project指向另一个app.config文件使用 Primary output选项。所以我的解决方案将是一个变通办法。我希望你觉得它对你的情况有用。

概览:

基本思想是:

  • 去除强制app.config来自安装项目;
  • 添加指向 app.config 的文件, 手动;
  • 使用 MSBuild 进入 vdproj文件,并更改它以匹配转换后的 app.config 的真实输出。

  • 一些缺点是:
  • 安装项目只会更新,如果它部署的项目构建。啊...不是一个真正的缺点!
  • 您需要 MSBuild 4.0...这也可以解决!
  • 需要一个名为 FileUpdate 的自定义任务...它是开源的并且具有安装程序。

  • 让我们工作:

    1) 转到您的安装项目,然后选择主要输出对象,右键单击并转到属性。在那里您会找到 Exclude Filter ... 为 *.config 添加过滤器,因此它将删除硬编码的 app.config。

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

    3) 下载 MSBuild Community Tasks Project ,我推荐msi安装程序。

    4)卸载你的项目(csproj)并用这个替换另一个问题的代码:

    代码:
      <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
    <Target Name="AfterCompile" 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>
    <PropertyGroup>
    <SetupProjectPath>$(MSBuildProjectDirectory)\$(IntermediateOutputPath)$(TargetFileName).config</SetupProjectPath>
    </PropertyGroup>
    <!-- Change the following so that this Task can find your vdproj file -->
    <FileUpdate Files="$(MSBuildProjectDirectory)\..\Setup1\Setup1.vdproj"
    Regex="(.SourcePath. = .8:).*\.config(.)"
    ReplacementText="$1$(SetupProjectPath.Replace(`\`,`\\`))$2" />
    <FileUpdate Files="$(MSBuildProjectDirectory)\..\Setup1\Setup1.vdproj"
    Regex="(.TargetName. = .8:).*\.config(.)"
    ReplacementText="$1$(TargetFileName).config$2" />
    </Target>

    5)之前的代码一定要改一下,这样才能找到你的vdproj文件。我在代码中添加了注释,指出您需要更改的位置。

    现在,每次构建主项目时,MSBuild 都会更改安装项目,以便它使用正确的 app.config 文件。它可能有缺点,但这个解决方案可以改进并变得更好。如果您需要发表评论,我会尽快回复。

    我使用的资源

    需要 MSBuild 4.0,因为我需要使用 String 的 Replace 函数,将路径中的单个“\”替换为双“\”。看
    MSBuild Property Functions有关在 MSBuild 中使用函数的详细信息。

    我了解了 FileUpdate Task在另一个问题中。官方项目是 MSBuild Community Tasks Project .

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

    Trying to include configuration specific app.config files in a setup project

    Problems with setup project - am I thick?

    关于winforms - 我可以强制安装程序项目使用构建解决方案中的 .config 文件而不是原始解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834292/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com