Visual Studio 2022.NET Frame Work4.8.NET6의 소스 코드 공존(WinForms &WPF)

WinForms, WPF 등 Windows 기반 레거시 어플리케이션 개발
최근에 드디어 RC판 발매를 마쳤다.NET6도 잘 돌아가는지 확인하고 싶어요.
우선 WinForms와 WPF로 소스 코드를 최대한 이식하지 않는 방법이 어느 정도까지 대응할 수 있는지 시험해 봤다.
(나는 몇 가지 방법이 있다고 생각한다. 그 중 하나는 이렇다.)
크로스 플랫폼의 행위가 확인되지 않았습니다.
C++ 협업 등 현황도 확인되지 않았다(※ 크로스플랫폼 등에 착안해 P/Invoke를 사용하는 방법으로 전환하는 것을 권장한다.C+/CLI는 완전히 Windows 고유의 규격이다.)
보증 기간이 잠시 연기되어 지금까지도 WinForms와 WPF의 자산이 남아 있다.NET Frame Work4.8을 채택·운용하는 회사도 많은 것으로 생각한다.
조만간NET6 및 후속.NET8로의 이전을 고려하지 않으면 지원 기간 중 눈치채면 끝날 수 있으므로 전통기술을 보유한 회사가 잘 살펴봐야 한다.
프로젝트 여기 있습니다.
WPF 항목에 대해서는 잠시 기다려 주십시오.

구상적 환경


OS: Windows 버전 20H2(19042.1348 구축)

Windows Forms



프레임:.NET Framework 4.8
  • 개발 환경: Visual Studio 2019 Professional
  • C#7.0으로 개발
  • 프레임:.NET 6
  • 개발 환경: Visual Studio 2022 Preview Edition(17..0)
  • C#10.0으로 공유
  • C#7.0과 같은 코드로 설정된 경우아마 이식하면 null 허용형 경고(8.0 정도 채택된 것)가 많이 나올 거예요.
  • WPF


    만약 비교적 작은 프로그램이라면, 나는 매우 흔히 볼 수 있는 구성이라고 생각한다

    프레임:.NET Framework 4.8
  • 개발 환경: Visual Studio 2019 Professional
  • C#7.0으로 개발
  • 라이브러리
  • Prism.Core 7.2.0.1422
  • Prism.Wpf 7.2.0.1422
  • 프레임:.NET 6
  • 개발 환경: Visual Studio 2022 Preview Edition(17..0)
  • C# 10.0
  • 라이브러리
  • Prism.Core 7.2.0.1422
  • Prism.Wpf 7.2.0.1422
  • Microsoft.Xaml.Behaviors.Wpf1.19(추가)
  • 1. .NET6용 솔루션 및 프로젝트 작성


    먼저 Visual Studio 2022.NET6용 솔루션 제작.
    이 이름은'WinForms MVCDotne6'이다.
    목록의 구성은 이렇다.

    다음은 Visual Studio 2022를 통해 WinForms와 같은 프로젝트를 제작할 때
    프로젝트 폴더가 생성됩니다.
    C# 기본적으로 프로젝트의 바로 아래 파일만 참조할 수 있으며 프로젝트를 VS 제작할 경우
    csproj 파일을 정리하여 원본 코드를 읽고 다음 디렉터리 설정으로 만듭니다

    2. 조건부 컴파일


    .NET5 이후 프로젝트 중 사전 프로세서 NETFTRAMEWORK 추가
    .NET Framework는 조건부 컴파일을 수행할 수 있습니다.
    그건NET5 이후의 프레임 동작에만 해당됩니다.
    그래서NET Framework 측은 NETFTRAMEWORK를 조건부로 컴파일했습니다.

    3. Properties\AssemblyInfo.cs


    .NET의 항목에 다음 오류가 발생합니다.

    이것은 AssemblyInfo에 적용된 정보를 기재합니다
    왜냐하면 중간 파일을 만들 때 이렇게 만들어져요.

    .NET6는 프로젝트의 설정 화면에서 기본적으로 포장의 이름과 버전을 직접 지정할 수 있다.
    따라서 한 버전 등을 정의해야 할 정보가 두 곳에서 정의돼 문제가 생겼다.

    따라서 AsseemblyInfo가 사용됩니다.cs에서 방금 설정한 조건부 컴파일 NETFRMEWORK를 지정합니다.NET6에 구축해야 합니다.

    4. 리소스 파일


    소스 코드는 Resources 입니다.resx 등에 의존해서 프로그램을 실행한다면 Resources.resx를 읽을 수 없습니다.
    이것에 대해 해결 방안을 고려했지만, 모든 자원 파일 공유가 어려울 것 같아서,Properties에서 다른 자원 파일을 다시 만듭니다.
    예를 들어, "ConfigDotnet6.resx"를 선택합니다.

    그리고 참고 자원 파일의 상응하는 부분에 다음과 같이 쓸 수 있다.
    #if NETFRAMEWORK
        return int.Parse(WinFormsMVC.Properties.Resources.MAX_DEPTH_TREEFORM);
    #else
        return int.Parse(WinFormsMVCDotnet6.Properties.ConfigDotnet6.MAX_DEPTH_TREEFORM);
    #endif
    

    왜 자원 파일이 공존할 수 없습니까


    코드 Designer가 자동으로 생성됩니다.자원 파일의 패키지 이름이 분배되었기 때문에, cs에서 ResourceManager 클래스에서 패키지 이름을 읽어야 합니다.

    5. bin 폴더의 디렉터리 분할


    출력 경로를 알기 쉬운 형식으로 바꾸자
    .NET6측

    .NET Framework 측면

    6. 중간 출력 디렉토리(obj 폴더)


    .NET Framework가 nuget 라이브러리를 사용하면 obj 폴더 때문에 문제가 발생합니다.
    .NET Core 시리즈의 프로젝트assets.obj 밑에서 제이슨을 직접 만들어요.

    이 메시지를 계속 남겨두면.NET Framework 쪽 건물에서 이 파일을 읽었기 때문이다.NET Framework 측면에서는 빌드할 수 없습니다.
    그곳에서 중간 서류를 분할하다.

    .NET Framework 프로젝트


    .NET Framework 측면의 csproj 파일은 다음과 같이 보완됩니다.
    WinFormsMVC.csproj
    <PropertyGroup>
      ...(省略)...
      <BaseIntermediateOutputPath>obj-netframework\$(AssemblyName)\</BaseIntermediateOutputPath>
      ...(省略)...
    </PropertyGroup>
    

    .NET6 프로젝트


    .NET6 면은 MSBuild15 이후 구문에서 구성 속성 Directory로 사용됩니다.Build.props를 지정하라는 지시가 있습니다.
    따라서 프로젝트 바로 아래에 Directory가 있습니다.Build.소개 만들기

    내용은 다음과 같다.
    Directory.Build.Props
    <Project>
     <PropertyGroup>
        <BaseIntermediateOutputPath>obj-net6\$(AssemblyName)\</BaseIntermediateOutputPath>
        <MSBuildProjectExtensionsPath>obj-net6\$(AssemblyName)\</MSBuildProjectExtensionsPath>
     </PropertyGroup>
    </Project>
    
    각 속성의 내용에 관해서는 아래의 내용을 참조하시오

    7. 중간 파일이 방해되어 필요하지 않은 다른 버전의 중간 파일을 프로젝트에서 삭제


    또 이렇게 구축하면 사실상 문제가 발생할 수 있다.

    이것은 방금 생성된 중간 파일'obj-netframework'또는'obj-net6'이 서로 간섭하는 것이다.
    .NETFramework,Version=v4.8.AssemblyAttributes.cs
    .NETCoreApp,Version=v6.0.AssemblyAttributes.cs
    파일을 동시에 읽을 때까지 기다립니다.
    처리 방법이 매우 간단하다.
    프로젝트에서 중간 파일을 삭제합니다.
    파일 자체가 필요하므로 Visual Studio 화면에서 삭제합니다.
    자원 관리자 등에서 잘못 삭제할 수 없습니다.

    .NET Framework 측에서 발생한 오류


    'obj-***'로 명명된 물건은 IDE 측에서 읽지 않는 경우도 있지만, MSBuild에서는 왜 식별되는지 알 수 없다.
    이 경우 "obj-net 6"을 솔루션 자원 관리자에 끌어다 놓고 바로 삭제합니다.

    8.nuget 라이브러리로 라이브러리 설치, 업데이트


    .NET Framework에는 한정된 범위 내에서만 사용할 수 있는 라이브러리가 있고, 버전이 다른 라이브러리도 있으니 각기 주의하시기 바랍니다.

    완성


    이렇게 하면 간단한 프로젝트라면 원본 코드가 공존하면 완성된다.
    그러나 실제로nuget 주위의 라이브러리에 대해서는 각종 라이브러리에 따라 대응 방법이 다르다
    이 경우 방금 사용한 조건부 컴파일 NETFTRAMEWORK 등 신중하게 내용을 변경해야 한다.

    WPF의 이식으로 막힌 점


    기본 절차는 같지만 WPF를 사용할 때 몇 가지 주의점이 있기 때문에 미리 배열한다.
    이건NET Core로 이전할 때도 변경된 부분이 있습니다.
    또 주의해야 할 부분이 많다고 생각해 WPF 자체 변경과 라이브러리 고유의 이식 실태를 조사했다

    System.Windows.Interactivity.dll 사라짐, Xaml.Behaviors.Wpf로 대체됨


    System.Drawing.Image 라이브러리 사용 시 재설치 필요


    가장 치명적인 변경이죠.
    처리의 고속화 등을 어떻게든 구상했기 때문에 비트맵 이미지 등급 등이 아닌 어쩔 수 없이 이미지 등급을 적용하는 경우도 있었다.
    이 경우 재실시가 필요하다(대안은 조사 중).
    참고 가치가 있는 사이트
    다만 vs2022는 참조를 정상적으로 가져올 수 없습니다.

    문자 코드 Shift-JIS는 기본적으로 사용할 수 없습니다.


    문자 코드 문제

    좋은 웹페이지 즐겨찾기