概要:
アセンブラーで小さなゲーム エンジンを作成し、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 ステートメントに間違いがあるのでしょうか、それとも問題ないように見えますか?
この問題の原因として他に何が考えられますか?
私の質問の解決に役立つ可能性のある詳細情報が必要な場合は、遠慮なくコメントでお問い合わせください。