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>
