ご対応いただきありがとうございます。
ご提供いただいた DxLibDotNet.zip に差し替えて試してみましたが
やはり「PInvoke 関数 'DxLibDotNet!DxLibDLL.DX::dx_LoadSoundMemByMemImage_x86' がスタックを不安定にしています。」という例外が発生してしまいます。
DxLibDotNet.dll を dnSpy に掛けてみたところ
// Token: 0x060013D2 RID: 5074
[DllImport("DxLib.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "dx_LoadSoundMemByMemImage")]
private static extern int dx_LoadSoundMemByMemImage_x86(IntPtr FileImage, ulong FileImageSize, int BufferNum, int UnionHandle);
// Token: 0x060013D3 RID: 5075
[DllImport("DxLib_x64.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "dx_LoadSoundMemByMemImage")]
private static extern int dx_LoadSoundMemByMemImage_x64(IntPtr FileImage, ulong FileImageSize, int BufferNum, int UnionHandle);
となっており _x86 版も ulong FileImageSize になっているように見受けられました。
また、試しに以下のコードを実行してみたところ、例外が発生することなく音楽の再生に成功しました。
コード:
[DllImport("DxLib.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "dx_LoadSoundMemByMemImage")]
private static extern int My_dx_LoadSoundMemByMemImage_x86(IntPtr FileImage, uint FileImageSize, int BufferNum, int UnionHandle);
//private static extern int My_dx_LoadSoundMemByMemImage_x86(IntPtr FileImage, ulong FileImageSize, int BufferNum, int UnionHandle); // original
〜〜〜
byte[] mp3Data = File.ReadAllBytes(mp3FileName);
int handle;
GCHandle h = GCHandle.Alloc(mp3Data, GCHandleType.Pinned);
try
{
handle = My_dx_LoadSoundMemByMemImage_x86(h.AddrOfPinnedObject(), (uint)mp3Data.Length, 3, -1);
}
finally
{
h.Free();
}
DX.PlaySoundMem(handle, DX.DX_PLAYTYPE_LOOP, 1);
勘でやっているのでこれが正しいのかはよくわかっていません...
実は現在 DxLib v3.20f を使用していまして、
先日ふと最新版の DxLib v3.22c を試してみようとしたところ本件の事象に遭遇し、本スレッドを立てた次第です。
(3.20f では本件の事象は発生しません)
なので当面は v3.20f を継続してこのまま使い続けることに致します。
管理人様におかれましては、どうか余裕があるときにご対応いただけたら当方幸いでございます。
よろしくお願いします。