2014-09-26 85 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」 選項。 也試圖將構建更改爲x86,而不是任何CPU沒有任何運氣。

:我使用的是4.5框架,IIS 8

回答

2

我認爲這個問題是FindMimeFromData的簽名()。看看這裏PInvoke.net爲函數的正確的簽名:

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

..所以代替UINT爲中國人民銀行和ppwzMimeOut您需要的IntPtr!

參見:

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

+0

感謝您的解決方案。今天我不得不使用它,它完美地工作。 – Sheep 2015-02-18 17:02:07

相關問題