クラスライブラリのプロジェクトを .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では動作しないって意味なんじゃないかな?
これでビルドのエラーは解消。さて、あとはちゃんと使えるかな??