クラスライブラリを.NET Coreへ移植

クラスライブラリのプロジェクトを .NET Coreへ移植したら、いろいろ大変だったメモ。

クラスライブの概要

一部Formアプリ用のクラスを含むクラスライブラリプロジェクト。

.net framework 4.x
Form用のクラスライブラリを含む

.NET Coreへの移植

移植方法はリンク先にまとまっているので、こちらを参照。

[.NET Conf 2019]のデスクトップアプリケーション.NET Core対応についてのセッションを日本語訳した(.NET Coreを使用した.NET デスクトップアプリケーションの近代化)

リンク先の「5-2. 手作業での.NET Coreへの移植手順」を参考に、新規プロジェクトで、「クラス ライブラリ(.NET Core)」を選んでプロジェクトを作成する。

.csprojを開くとこんな感じ。すっごいシンプル。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

</Project>

同じフォルダに、元のクラスライブラリからフォルダやソースコード(.cs)コピーすると、自動的にプロジェクトの一部として認識される。よくてできてる。

ただし、「Properties」フォルダ、というかフォルダに含まれるAssemblyInfo.csは.NET Coreと競合するようなのでコピーしてはいけないっぽい。

「6. Windows Compatibility Pack」のインストールも忘れずに。

そしてビルドすると、System.Windowsに関連するエラーが山ほど出る。

重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
エラー	
CS0234	型または名前空間の名前 'Forms' が名前空間 'System.Windows' に存在しません (アセンブリ参照があることを確認してください)。	MyClassLib	C:\Repos\MyClassLib\Utilities.cs	4	アクティブ

概要に書いたようにFormアプリ用のライブラリを含んでいる。クラスライブラリからSystem.Windowsを参照している場合は、プロジェクト(.csproj)に<UseWindowsForms>true</UseWindowsForms>を追加する。

最初に用意した.NET Coreのプロジェクトの中身は最終的に以下のようになった。

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWPF>true</UseWPF>
    <UseWindowsForms>true</UseWindowsForms>
    
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="3.1.1" />
  </ItemGroup>

</Project>

1行目のSdkに”WindowsDesktop”が追加されているのは、たぶんWindows環境の意味。つまり、MacやLinuxでは動作しないって意味なんじゃないかな?

これでビルドのエラーは解消。さて、あとはちゃんと使えるかな??


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です