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 を使わない場合(手動)
- GitHubから取得:https://github.com/flibitijibibo/SDL2-CS
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.dll | SDL2.dll の配置ミス or PATH未設定 |
SDL2 not initialized | SDL_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>