Open3
C#/.NET クロスプラットフォーム対応
ピン留めされたアイテム
C#/.NETでクロスプラットフォーム対応
ライブラリ
- .NET Standard 2.0対応なら基本xplat
- ただし特定プラットフォーム固有機能呼び出しがある場合は注意
- .NET 5+で
-windows
とかあるのはダメ
UI
- Avalonia UI
- MAUI
- ただし、Linux/macOS(not Cataryst)非対応
- Uno Platform
- Blazor
XAML系UIプラットフォームの関係図
General
-
Microsoft.Maui.Essentials
- Avalonia公式でもすすめているMS公式ライブラリ(MAUI以外でも使える)
- ただし、Linux/macOS非対応
- reactiveui/splat: Makes things cross-platform
Sound & Graphics
-
Silk.NET - High-Speed & Advanced .NET Graphics & Compute
- providing bindings to popular low-level APIs such as OpenGL, OpenCL, OpenAL, OpenXR, GLFW, SDL, Vulkan, Assimp, WebGPU, and DirectX.
-
OpenTK
- low-level C# bindings for OpenGL, OpenGL ES, OpenAL, and OpenCL.
-
LibVLCSharp
- a cross-platform audio and video API for .NET platforms based on VideoLAN's LibVLC Library.
Graphics
-
SkiaSharp
- Skiaの.NET binding
- webp変換とかにも使える
-
HarfBuzzSharp
- HarfBuzzSharp is a cross-platform OpenType text shaping engine for .NET platforms.
Sound
-
OpenTK.Audio
-
CSCore
-
soxsharp
-
SharpAudio
-
luthfiampas/Bufdio: A cross platform audio playback library for .NET with PortAudio and FFmpeg
- portaudioとFFmpegで動くライブラリ
- Bufdio.Spice86もある
-
FFMpegの各種ラッパー
-
LibVLCSharp
- 実はオーディオ変換・再生に使える
-
SFML.Net - Simple and Fast Multimedia Library for .Net
- モバイル非対応
-
ar1st0crat/NWaves: .NET DSP library with a lot of audio processing functions
-
Audio Tools Library (ATL) for .NET
- easy-to-use library to read and write metadata from digital audio files and playlists
Other
-
TextCopy
- A cross platform package to copy text to the clipboard.
- TolikPylypchuk/SharpHook: SharpHook provides a cross-platform global keyboard and mouse hook, event simulation, and text entry simulation for .NET
- xoofx/zio: A cross-platform abstract/virtual filesystem framework with many built-ins filesystems for .NET
- alastairlundy/PlatformKit: Cross-platform OS and Platform Detection for .NET
- reactiveui/Akavache: An asynchronous, persistent key-value store created for writing desktop and mobile applications, based on SQLite3. Akavache is great for both storing important data as well as cached local data that expires.
- SrcForger/Marrow.XPlat: Cross platform (desktop and mobile) application framework for .NET
他言語binding
-
Cysharp/csbindgen: Generate C# FFI from Rust for automatically brings native code and C native library to .NET and Unity.
- csbindgen - C#のためのネイティブコード呼び出し自動生成、或いはC#からのネイティブコード呼び出しの現代的手法について
- Rust binding
- xplatなRustライブラリがあればC#/.NETから呼び出せるようになる
ドキュメント
- Building Cross-Platform Applications (Avalonia)
TIPS
クロスプラットフォームで使わない方がいいこと
標準ライブラリ
-
System.Common.Drawing
- System.Drawing.Common が Windows でしかサポートされない
- 代わり→ ImageSharp(ライセンス注意)とかSkiaSharpとか
ライブラリ
- NAudio
- xplat対応が途中(分割してもWindows依存が残ってる)
- 代わり→ https://zenn.dev/link/comments/5073988a57344a
xplat Tips
Path
- パス(ファイルパスなど)
-
Path.Combine()
は自動で実行OSの区切り文字で繋いでくれる - ただし、最初から区切り文字が入っている場合は変換されない
- 例:
-
Path.Combine(@"C:\\abc\d", "file.txt"); // unix系だと C:\\abc\d/file.txt になる
- 別のプラットホームにパスを渡す場合に問題になる
- Windowsは
/
も受け付けるので全部/
に統一してしまうのも手
- Windowsは
var c = """C:\\abc\d""";
var nc = string.Join(Path.AltDirectorySeparatorChar, c.Split(@"\")); //またはReplaceでも
-
Path.AltDirectorySeparatorChar
はWindowsでもUnix系OSでも常に/
-
ライブラリ
Process.Start()
- フォルダ・ディレクトリを開く時、よくある
explorer.exe
を指定するのはWindows限定になる - FileNameにディレクトリパスを指定するだけで良いっぽい?
Process.Start(new ProcessStartInfo
{
FileName = @"C:\path\to\folder", // 開きたいフォルダのパス
UseShellExecute = true
});
プロセス問題(Win)
みたいな話があるらしい。
Win10/.NET8.0環境だと、ProcessStartInfo.FileName
に渡せばプロセス増えなかった。
/select
が不要ならWinAPIまで呼ばなくても良さそう。
Launcher
-
Avalonia UIにはv11.1から
Launcher
クラスがある-
LaunchFileAsync
- Starts the default app associated with the specified storage file or folder.
-
LaunchDirectoryInfoAsync
- Starts the default app associated with the specified storage directory (folder).
-
LaunchFileAsync
-
MAUIにもある
- https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/appmodel/launcher
- ただし、Windows以外は色々と設定が追加で必要