これは何度も尋ねられていることを知っていますが、残念ながら私の問題に対する解決策が見つかりませんでした。urlmon.dll
バイト配列から MIME タイプを見つけるために使用していますが、IIS プロセスによってクラッシュが発生します。w3wp.exe
保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。
コード:
public static int MimeSampleSize = 256;
public static string DefaultMimeType = "application/octet-stream";
[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static uint FindMimeFromData(
uint pBC,
[MarshalAs(UnmanagedType.LPStr)] string pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
uint cbSize,
[MarshalAs(UnmanagedType.LPStr)] string pwzMimeProposed,
uint dwMimeFlags,
out uint ppwzMimeOut,
uint dwReserverd
);
public static string GetMimeFromBytes(byte[] data)
{
try
{
uint mimeType;
FindMimeFromData(0, null, data, (uint)MimeSampleSize, null, 0, out mimeType, 0);
var mimePointer = new IntPtr(mimeType);
var mime = Marshal.PtrToStringUni(mimePointer); // <-- Crash happens here
Marshal.FreeCoTaskMem(mimePointer);
return mime ?? DefaultMimeType;
}
catch
{
return DefaultMimeType;
}
}
クラッシュは次の行で発生します。
var mime = Marshal.PtrToStringUni(mimePointer);
Suppress JIT optimization on module load
" " オプションのチェックを外そうとしましたが、うまくいきませんでした。また、ビルドを任意の CPU の代わりに x86 に変更しようとしましたが、うまくいきませんでした。
注:私は4.5フレームワーク、IIS 8を使用しています