0Pricing
C# Academy · レッスン

相互運用の基礎(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の目的

確認問題: P/Invokeで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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. C#スクリプティング(dotnet script)、スニペットとREPL
  2. 相互運用の基礎(P/Invoke)の概要
  3. CLIの使いやすさ
← C# Academyに戻る