相互運用の基礎(P/Invoke)の概要
P/Invokeでネイティブ関数を呼び出します。DllImportの基礎、文字列のマーシャリング、SetLastError、簡単なWin32デモ(Sleep、GetTickCount64)を扱います。
「相互運用の基礎(P/Invoke)の概要」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
概念と目標
P/Invokeを使うと、C#からネイティブDLLの関数を呼び出せます。
- DllImportを使用してメソッドをバインドします
- 必要に応じてCharSetとSetLastErrorを選択します
- シグネチャを単純かつ正確に保ちます
P/Invoke: Sleep
DllImportを使用してマネージドメソッドを宣言し、ネイティブ関数をバインドします。
using System;
using System.Runtime.InteropServices;
// Simple P/Invoke call to native Sleep (Windows kernel32)
// Note: This demo may only run on Windows, but it compiles everywhere.
public class Program
{
[DllImport("kernel32.dll")]
private static extern void Sleep(uint dwMilliseconds);
public static void Main(string[] args)
{
Console.WriteLine("Sleeping for 200 ms...");
// Call native function
Sleep(200);
Console.WriteLine("Awake!");
}
}
ネイティブの戻り値
ネイティブのシグネチャに合わせます。ここでは符号なし64ビット値を返します。
using System;
using System.Runtime.InteropServices;
// Get system uptime (ms) from native function.
public class Program
{
[DllImport("kernel32.dll")]
private static extern ulong GetTickCount64();
public static void Main(string[] args)
{
ulong ms = GetTickCount64();
Console.WriteLine("Uptime (ms): " + ms);
}
}
文字列とCharSet
ワイド文字列API(「W」版)にはCharSet.Unicodeを使用します。サポートされていないプラットフォームでは、実行時エラーを捕捉します。
using System;
using System.Runtime.InteropServices;
// Demo: marshaling strings to Unicode with CharSet.Unicode.
// On non-Windows environments this may fail at runtime.
public class Program
{
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
public static void Main(string[] args)
{
Console.WriteLine("Calling MessageBox (may require Windows GUI)...");
// 0x00000040 = MB_ICONINFORMATION
try
{
int result = MessageBox(IntPtr.Zero, "Hello from P/Invoke", "Interop", 0x00000040);
Console.WriteLine("MessageBox returned: " + result);
}
catch (Exception ex)
{
Console.WriteLine("MessageBox failed at runtime: " + ex.GetType().Name);
}
}
}
SetLastErrorと型
エラー処理:
- GetLastErrorを設定するAPIには、DllImportにSetLastError=trueを追加します
- 呼び出しに失敗した後、Marshal.GetLastWin32Error()を読み取ります
- 正確な型を優先します。uintとintを使い分け、ポインターにはIntPtrを使用します
相互運用の適切な運用
- 複雑な構造体を使わない単純なAPIから始めます
- ハンドルにはIntPtrを使用し、適切なネイティブ関数で解放します
- ヘッドレス環境でGUI呼び出しを行わないでください
- プラットフォームの制限(Windows専用など)を文書化します
DllImportの目的
まとめ
まとめ: DllImportでネイティブ呼び出しを宣言し、型を慎重に合わせ、文字列にはCharSetを選択します。該当する場合はSetLastErrorとGetLastErrorを使用してエラーを処理します。
よくある質問
「相互運用の基礎(P/Invoke)の概要」レッスンは無料ですか?
はい。「相互運用の基礎(P/Invoke)の概要」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「相互運用の基礎(P/Invoke)の概要」で何を学びますか?
P/Invokeでネイティブ関数を呼び出します。DllImportの基礎、文字列のマーシャリング、SetLastError、簡単なWin32デモ(Sleep、GetTickCount64)を扱います。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「相互運用の基礎(P/Invoke)の概要」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- C#スクリプティング(dotnet script)、スニペットとREPL
- 相互運用の基礎(P/Invoke)の概要
- CLIの使いやすさ