Windows で .NET 9 と SDL2 を組み合わせて使う場合

Windows で .NET 9 と SDL2 を組み合わせて使う場合、以下の手順で SDL2 を C# (.NET) から安全に使えます。これは「ゲームやグラフィックス処理を行うアプリ」を作成するベースにもなります。


目次

✅ 手順:Windows + .NET 9 + SDL2 + SDL2-CS(ラッパー)

1. .NET 9 SDK をインストール

.NET 9(プレビュー版を含む)を Microsoft 公式からインストール:
👉 https://dotnet.microsoft.com/en-us/download/dotnet/9.0


2. SDL2 をダウンロード(ネイティブDLL)

SDL公式から Windows 用バイナリを取得:

  • ダウンロード元:https://www.libsdl.org/download-2.0.php
  • ダウンロード対象:SDL2-2.0.x-win32-x64.zip
  • 解凍して SDL2.dll をプロジェクトの実行フォルダにコピー(bin/Debug/net9.0/など)

3. SDL2-CS を取得(C#ラッパー)

SDL2-CS は、C# から SDL2 を使うための公式ラッパーです。

A. NuGet を使う場合(推奨)

dotnet new console -n SdlTest
cd SdlTest
dotnet add package SDL2-CS

B. NuGet を使わない場合(手動)

  1. GitHubから取得:https://github.com/flibitijibibo/SDL2-CS
  2. src/SDL2.cs をコピーしてプロジェクトに含めます。

4. SDL 初期化コードのサンプル(Program.cs

using System;
using SDL2;

class Program
{
    static void Main()
    {
        SDL.SDL_Init(SDL.SDL_INIT_VIDEO);
        IntPtr window = SDL.SDL_CreateWindow("SDL2 .NET9 Window",
            SDL.SDL_WINDOWPOS_CENTERED, SDL.SDL_WINDOWPOS_CENTERED,
            800, 600, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);

        IntPtr renderer = SDL.SDL_CreateRenderer(window, -1, 0);
        SDL.SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); // 暗い青
        SDL.SDL_RenderClear(renderer);
        SDL.SDL_RenderPresent(renderer);

        bool quit = false;
        SDL.SDL_Event e;
        while (!quit)
        {
            while (SDL.SDL_PollEvent(out e) != 0)
            {
                if (e.type == SDL.SDL_EventType.SDL_QUIT)
                    quit = true;
            }
            SDL.SDL_Delay(16);
        }

        SDL.SDL_DestroyRenderer(renderer);
        SDL.SDL_DestroyWindow(window);
        SDL.SDL_Quit();
    }
}

✅ 必要なDLL配置

プロジェクトの実行フォルダ(例:bin/Debug/net9.0/)に以下をコピー:

  • SDL2.dll
  • (必要に応じて)SDL2_image.dll, SDL2_ttf.dll など

✅ よくあるエラー対処

エラー原因
System.DllNotFoundException: SDL2.dllSDL2.dll の配置ミス or PATH未設定
SDL2 not initializedSDL_Init() を呼んでいない
ウィンドウが表示されないSDL_CreateWindow 失敗 → SDLログを確認

サンプルコード

MySdlapp/
mainWindow.cs
Program.cs
MySdlapp.csproj
SDL2-dll
SDL2-CS/

Program.cs

using System;

class Program
{
    static void Main(string[] args)
    {
        var main = new mainWindow();
        main.Run();
    }
}

mainWindow.cs

using System;
using SDL2;

public class mainWindow
{
    private IntPtr window;
    private bool running = true;

    public void Run()
    {
        SDL.SDL_Init(SDL.SDL_INIT_VIDEO);

        window = SDL.SDL_CreateWindow("Main Window",
            SDL.SDL_WINDOWPOS_CENTERED, SDL.SDL_WINDOWPOS_CENTERED,
            640, 480, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);

        SDL.SDL_Event e;
        while (running)
        {
            while (SDL.SDL_PollEvent(out e) != 0)
            {
                if (e.type == SDL.SDL_EventType.SDL_QUIT)
                {
                    running = false;
                }
            }
            SDL.SDL_Delay(16);
        }

        SDL.SDL_DestroyWindow(window);
        SDL.SDL_Quit();
    }
}

MySdlapp.csproj

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SDL2-CS" Version="2.0.0" />
  </ItemGroup>

</Project>
よかったらシェアしてね!
目次