나는 여러 번 질문을 받았지만 불행히도 내 문제에 대한 해결책을 찾지 못했다. urlmon.dll
을 사용하여 MIME 유형을 배열에서 찾는다. 바이트 수는 있지만 IIS 프로세스에서 충돌이 발생합니다. w3wp.exe
"보호 된 메모리를 읽거나 쓰려고 시도했습니다."urlmon.dll로 인한 것
보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다.
코드 :
는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 프레임 워크를 사용하고, 8
감사합니다. 오늘 이걸 사용해야 만했고 완벽하게 작동했습니다. – Sheep