【VB.NET】Windows Form에서 설정값을 Debug와 Release로 전환하고 싶다

8970 단어 VisualStudioVB. 네 t
타이틀대로 일을 하고 싶었지만, 생각보다 고생했기 때문에 그 메모.
Visual Studio 2017

실패: ASP.NET에서 App.config를 전환하는 기능 사용



ASP.NET에서는 빌드 구성에 맞게 App.config를 전환하는 기능이 있지만 Windows Form에는 없다.
검색하면 Windows 앱에서도 ASP.NET의 기능을 유용하고 config 파일을 대체하는 수단을 찾을 수 있습니다.

App.config를 빌드 대상으로 다시 작성 - Qiita

그러나 실제로 해봐도 빌드 후의 config 파일이 바뀌지 않는다.<appSettings> 태그도 「설정」관련의 어느 쪽도 바꾸지 않고.

Settings 파일을 2개 만들고 빌드시 구성에 따라 전환하려고 했지만 그것도 안 됐다.
<None Include="Settings.Debug.settings" Condition=" '$(Configuration)' == 'Debug' ">
  <Generator>SettingsSingleFileGenerator</Generator>
</None>
<None Include="Settings.Release.settings" Condition=" '$(Configuration)' == 'Release' ">
  <Generator>SettingsSingleFileGenerator</Generator>
</None>

condition 속성이 유효하게 되지 않고, 파일명=클래스명이 되어 버리므로 치환되어 있지 않다.

프로젝트 바로 아래에 Debug와 Release의 폴더를 만들고 같은 Settings1.settings라는 파일을 만들어 보았을 때 서로 충돌하고 app.config와 settings 파일을 덮어 쓰고 버린다.

빌드 후 스크립트에서 config 파일의 내용 바꾸기



Visual Studio에는, 빌드 전, 빌드 후에 실행시키고 싶은 것을 지정할 수 있다.
방법: 빌드 이벤트 지정(Visual Basic) - Visual Studio | Microsoft Docs

이것을 사용해, 빌드 후에 config 파일을 옮겨놓는 처리를 자작했다.

config 파일 준비



원본 App.config와 구성별 config 파일을 준비합니다.

3개가 늘어서는 것이 귀찮다면, vbproj 파일을 만지면 다음과 같이 할 수 있다.


vbproj 파일 발췌
<Content Include="App.config">
  <SubType>Designer</SubType>
</Content>
<Content Include="App.Debug.config">
  <DependentUpon>App.config</DependentUpon>
  <SubType>Designer</SubType>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
  <SubType>Designer</SubType>
</Content>

PowerShell에서 config 파일의 내용 덮어쓰기



.NET에는 config 파일을 읽고 쓰기 위한 클래스 등이 준비되어 있지만, 「설정」의 부분은 취급할 수 없기 때문에, 보통의 XML 파일로서 읽고 쓰기한다.

appSettings 태그 밖에 사용하지 않는 경우 유용한 방법.
PowerShell에서 응용 프로그램 구성 파일 (app.config) 읽기 및 쓰기 - 잠시 기술 블로그

App.config를 XML 파일로 읽고 아래에 둘러싸인 부분을 읽고 바꿉니다.


PowerShell에 전달하는 매개 변수로 다음이 필요합니다.
  • 원본 App.config 파일 경로
  • 대체 할 내용이 들어있는 App.config 파일 경로 (App.Debug.config 등)
  • 프로젝트 이름 (MySettings가 정의 된 태그 이름에 프로젝트 이름이 들어 있음)

  • 샘플 스크립트(일부)
    Param($targetAppConfigPath, $sourceAppConfigPath, $outputPath, $projectName)
    
    Add-Type -AssemblyName System.Configuration
    
    if (!(Test-Path $targetAppConfigPath) -or !(Test-Path $sourceAppConfigPath)) {
        return
    }
    
    # ファイル読込
    [xml]$targetAppConfig = Get-Content $targetAppConfigPath -Encoding UTF8
    [xml]$sourceAppConfig = Get-Content $sourceAppConfigPath -Encoding UTF8
    
    function main() {
    
        copySettings "configuration/applicationSettings/$projectName.My.MySettings"
        copySettings "configuration/userSettings/$projectName.My.MySettings"
        copyConnectionStrings "configuration/connectionStrings"
        copyAppConfigs "configuration/appSettings"
    
        $targetAppConfig.Save($outputPath)
    }
    

    PowerShell을 프로젝트에 배치



    프로젝트에 ps1 파일을 넣습니다. 샘플에서는 "BuildScripts"폴더에 넣었다.


    PowerShell 빌드 후 실행



    프로젝트 속성을 열고 컴파일 탭에서 빌드 이벤트를 누릅니다.


    다음 명령은 빌드 후 명령에 추가됩니다.
    powershell -NoProfile -ExecutionPolicy Unrestricted -file "$(ProjectDir)BuildScripts\ReplaceSettings.ps1" "$(ProjectDir)App.config" "$(ProjectDir)App.$(ConfigurationName).config" "$(TargetDir)$(TargetFileName).config" $(ProjectName)
    

    일반적으로, PowerShell을 호출할 때 -file 는 없어도 좋을 것이지만, 여기에서는 붙이지 않으면 에러가 된다.

    그러면 출력 폴더에 각 구성의 설정 값이 출력됩니다.

    이 스크립트를 사용한 샘플을 GitHub에 보관했습니다.
    htps : // 기주 b. 코 m / ゔ ぃ く な パコ s / vb

    좋은 웹페이지 즐겨찾기