1

概要:

アセンブラーで小さなゲーム エンジンを作成し、DllImport を介して C# プロジェクトのクラスでエンジン DLL からエクスポートされた関数を使用します。これまでのところすべて正常に動作していますが、LoadTexture 関数を実行するとAccessViolationExceptionが発生し続けます。

これは、.NET Frameworks Bitmap クラスを介してテクスチャをロードし、最初のピクセル データ (mybitmap.Scan0) のアドレスをネイティブ DLL に渡すことを意図しています。これにより、テクスチャがレンダリングされます。ただし、ネイティブ コードがこのメモリ アドレスからデータにアクセスしようとするとすぐに、AccessViolationExceptionが発生します。

これは、この関数の私の DllImport コードがどのように見えるかです:

[System.Runtime.InteropServices.DllImportAttribute("engine.dll", 
    CharSet = CharSet.Ansi, 
    CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall, 
    ExactSpelling = true), 
    System.Security.SuppressUnmanagedCodeSecurity
]
private static extern void LoadTexture(int width, int height, IntPtr handle);

そして、これは私のネイティブ関数を呼び出す C# コードです。

public static void LoadTexture(string file)
{
    Bitmap bitmap = new Bitmap(file);

    BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, 
    bitmap.Width, bitmap.Height),
    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    LoadTexture(data.Width, data.Height, data.Scan0);
}

質問:

  • 私の DllImport ステートメントに間違いがあるのでしょうか、それとも問題ないように見えますか?

  • この問題の原因として他に何が考えられますか?

私の質問の解決に役立つ可能性のある詳細情報が必要な場合は、遠慮なくコメントでお問い合わせください。

4

1 に答える 1

2

テクスチャ ビットマップをメモリにロックしましたか? Bitmap.LockBits()ポインターで遊ぶ前に使用する必要があります。

http://msdn.microsoft.com/en-us/library/5ey6h79d.aspxを参照してください

于 2012-11-09T02:47:41.437 に答える