🐈

VisualStudio2022+AvaloniaUIでLinux/Windows用アプリ開発(環境構築)

2024/02/18に公開

やりたいこと

Visual Studio と C#でLinux / Windows マルチプラットフォームのDesktopアプリケーションを作りたい。

使用環境

Microsoftはマルチプラットフォーム用にMAUIを提供している。が、LinuxにはConsole Applicationのみ対応。UI周りは対応していない。そこでAvaloniaUI + VisualStudio2022を使って作ってみることにした。

Windows 11 : Home 22H2 + Visual Studio Community 2022(64bit)
Linuxテスト環境 : 上記Windows上のWSL2 Ubuntsu 22.04.2 LTS

AvaloniaUIのの導入方法

VisualStudioの「拡張機能」->「ManageExtensions」から
オンラインで検索し、「Avalonia for Visual Studio 2022」をインストールする。

プロジェクト作成 & Windows上での実行

1.VisualStdioの「新しいプロジェクトの作成」を開き、
「テンプレートを検索」から「Avalonia C# Project」を探して選択して「次へ」

2.プロジェクト名(ここでは"AvaloniaUIExample")を指定して「作成」

3.Select Target PlatForm -> Desktop, Design pattern -> Reactive UIを選択して「Create」, Add FeaturesからCompliled Bindingを追加して「Create」
※Compiled Bindingは入れてはいけない。現状いろいろ問題がある。
編集に支障があるだけではなく、動くはずのコードがコンパイルできなくなるケースがある。
https://github.com/AvaloniaUI/Avalonia/issues/8684

4.ソリューションエクスプローラの*.Desktopプロジェクトを右クリック->スタートアッププロジェクトに設定

5.これで実行すると下記のようなアプリケーションのひな型ができる

Linux上での単体実行ファイルの作成

単体実行ファイルを作成することでLinux側に何もインストールすることなくLinux用実行ファイルを作成できる。

1.*.Desktopプロジェクトを右クリックし、「発行」をクリック。

2.公開場所->フォルダ。ターゲット->フォルダを選択。場所(フォルダパス)を入力して「完了」

3.出てきたこのタブの最下部の「すべての設定を表示」をクリック

4.プロファイル設定で配置モードを「自己完結」に設定。(これでlinuxにdotnetをインストールしなくても動くようになる)
ターゲットランタイムを「linux-x64」に設定。
ファイルの公開オプションを開き、「単一ファイルの生成」をチェック
して「保存」


※「未使用コードのトリミング」をチェックしてはいけない。チェックするとWindows/Linux環境を問わず動作しなくなるケースがある。

5.「発行」を押す。

6.下記の「フォルダを開く」を押して、そこのファイルをすべてlinux環境にコピーする

7.linux起動。該当フォルダでファイルにchmodで実行権限をつけ、*.Desktopを起動すると、以下のエラーが出る

Unhandled exception. System.DllNotFoundException: Unable to load shared library 'libICE.so.6' or one of its dependencies. In order to help diagnose loading problems, consider using a tool like strace. If you're using glibc, consider setting the LD_DEBUG environment variable:

8.以下のpackageをinstall
sudo apt install libice6
sudo apt install libsm6
以下を参照
https://stackoverflow.com/questions/75281328/error-message-related-to-libice-so-6-makes-code-to-exit

9.起動成功

※Linux側の環境によってはversion GLIBCXX_* not foundが出るケースがあった。その場合は.netのバージョンを下げると動くケースがあった。

Discussion