Open3

C#/.NET クロスプラットフォーム対応

ピン留めされたアイテム
いぬいぬいぬいぬ

C#/.NETでクロスプラットフォーム対応

ライブラリ

  • .NET Standard 2.0対応なら基本xplat
    • ただし特定プラットフォーム固有機能呼び出しがある場合は注意
  • .NET 5+で-windowsとかあるのはダメ

UI

  • Avalonia UI
  • MAUI
    • ただし、Linux/macOS(not Cataryst)非対応
  • Uno Platform
  • Blazor

https://sourceforge.net/software/compare/.NET-MAUI-vs-Avalonia-UI-vs-Blazor-vs-Uno-Platform/

XAML系UIプラットフォームの関係図

General

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

Other

他言語binding

ドキュメント

TIPS

いぬいぬいぬいぬ

xplat Tips

Path

  • パス(ファイルパスなど)
    • Path.Combine()は自動で実行OSの区切り文字で繋いでくれる
    • ただし、最初から区切り文字が入っている場合は変換されない
      • 例:
Path.Combine(@"C:\\abc\d", "file.txt"); // unix系だと C:\\abc\d/file.txt になる
  • 別のプラットホームにパスを渡す場合に問題になる
    • Windowsは/も受け付けるので全部/に統一してしまうのも手
var c = """C:\\abc\d""";
var nc = string.Join(Path.AltDirectorySeparatorChar, c.Split(@"\")); //またはReplaceでも

Process.Start()

  • フォルダ・ディレクトリを開く時、よくあるexplorer.exeを指定するのはWindows限定になる
  • FileNameにディレクトリパスを指定するだけで良いっぽい?
Process.Start(new ProcessStartInfo
{
    FileName = @"C:\path\to\folder",  // 開きたいフォルダのパス
    UseShellExecute = true
});

プロセス問題(Win)

https://zenn.dev/nabezokodaikon/articles/83701c6d29eb69

みたいな話があるらしい。

Win10/.NET8.0環境だと、ProcessStartInfo.FileNameに渡せばプロセス増えなかった。
/selectが不要ならWinAPIまで呼ばなくても良さそう。

Launcher