2014-09-26 11 views
2

나는 여러 번 질문을 받았지만 불행히도 내 문제에 대한 해결책을 찾지 못했다. 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

답변

2

내가 문제가() FindMimeFromData의 서명 생각 IIS. 함수의 올바른 서명 여기 PInvoke.net 봐 :

http://www.pinvoke.net/default.aspx/urlmon/findmimefromdata.html

..so 대신 PBC와 ppwzMimeOut 당신을 IntPtr가 필요합니다 대한 UINT를!

은 참조 : 솔루션

urlmon.dll FindMimeFromData() works perfectly on 64bit desktop/console but generates errors on ASP.NET

+0

감사합니다. 오늘 이걸 사용해야 만했고 완벽하게 작동했습니다. – Sheep