C#でConsoleプロジェクトからWPFを扱う

C# コンピュータ
C#
WPFに依存するオブジェクトやライブラリをConsoleプロジェクトから呼び出したい。
以前WPFのクラスライブラリを作成しConsoleプロジェクトから参照する方法を試しました。
WPFのライブラリをConsoleプロジェクトから呼び出す
WPFのBitmapImageオブジェクトを使って画像ファイルの加工するプログラムを作りたいのですが、バッチ処理をする場合GUIは必要ないのでコンソールアプリとして作成したい。 WinFomrsなどで使われるBitmapオブジェクトの場合C...

consoleプロジェクトのcsprojファイル内でTargetFrameworkをnet7.0からnet7.0-windowsに変更することで参照することが出来ました。
さらにcsprojファイル内をのぞいてみるとWPFのプロジェクトファイルにはUseWPFという項目があり、Consoleプロジェクトには存在しませんでした。consoleプロジェクトのcsprojにUserWPFの項目を追加すればWPFを呼び出すことが出来るのではと思い、試した所成功しました。以前は失敗した記憶があるので環境に依存する部分があるかもしれません。

プロジェクトの作成

dotnet new console --name プロジェクト名
cd プロジェクト名

ソースコード

ファイル名:プロジェクト名.csproj

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

</Project>

変更点
net7.0⇒net7.0-windows
UseWPFを追加
ファイル名:Program.cs

using System.IO;
using System.Windows.Media.Imaging;

const string inFile = @".\test2.png";
const string outFile = @".\test1.png";
using var fs = new FileStream(inFile, FileMode.Open, FileAccess.Read);
var bi = new BitmapImage();

bi.BeginInit();
bi.CreateOptions = BitmapCreateOptions.None;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = fs;
bi.EndInit();
bi.Freeze();

using var stream = new FileStream(outFile, FileMode.Create, FileAccess.Write);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bi));
encoder.Save(stream);

サンプルプログラムはpng形式の画像を読み込んで別ファイル名で書き出しています。プログラムの内容的にはファイルのコピーで済む処理ですが、WPFのBitmapImageオブジェクトを作成し画像ファイルをロードし、別名でセーブしています。

ConsoleがつかえるとWPFに依存するオブジェクトなどをちょっと試す際に重宝しそうです。

コメント