.NET Core/.NET5以降のコンソールアプリでWPFの機能を利用する

.NET でコンソールアプリを作成した場合は WPF 関係のライブラリが使用できません。

static void Main(string[] args) { Bi tmapSource s = null; // CS0103 現在のコンテキストに 'BitmapSource' という名前は存在しません }

IDE 上には以下のように提案が出るのですが指定しても効きません。

f:id:Takachan:20211009170643p:plain

今回は

確認環境

この記事は以下の環境で動作確認を行っています。

  • ViauslStudio 2019(16.10.4)
  • .NET Core 3.1 + C#8.0
  • .NET 5 + C# 9.0

設定方法

ライブラリを使用したいプロジェクトのプロジェクトファイルを直接書き換える必要があるので、VisualStudio 上なら以下のように メニューを選択してプロ絵ジェクトファイルを開活きます。

プロジェクトのコンテキストメニュー > プロジェクト ファイルの編集

f:id:Takachan:20211009171018p:plain

初期値はだいたい以下のようになっていると思います。

// .csproj ファイル

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

これを以下のように書き換えます。

// .csproj ファイル

// .NET Core3.1 の場合
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <!-- ★★★(1) -->

  <PropertyGroup>
    <OutputType>WinExe</OutputType> <!-- ★★★(2) -->
    <TargetFramework>net5.0</TargetFramework>
    <UseWPF>true</UseWPF> <!-- ★★★(3) -->
  </PropertyGroup>

</Project>

// .NET 5 以降の場合
<Project Sdk="Microsoft.NET.Sdk"> <!-- 変更しない -->

  <PropertyGroup>
    <OutputType>WinExe</OutputType> <!-- ★★★(1) -->
    <TargetFramework>net5.0-windows</TargetFramework> <!-- ★★★(2) -->
    <UseWPF>true</UseWPF> <!-- ★★★(3) -->
  </PropertyGroup>

</Project>

これでエラーが消えます。

f:id:Takachan:20211009171454p:plain

コンソールウインドウが開かなくなる対応

.NET 5 以降、この設定を行うとコンソールウインドウが開かなくなったようで、その対応として以下のコードを追加します。

public static class Kernel32
{
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    public static extern bool AllocConsole();
}

static void Main(string[] args)
{
    Kernel32.AllocConsole(); // ★Mainの一番先頭に追記する

こうすると今まで通りコンソールウインドウが表示されます。

関連記事

takap-tech.com