我知道这个问题已经被问过很多次了,但是不幸的是我没有找到解决问题的方法,我一直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
”选项,但没有运气。还尝试将构建更改为x86而不是任何CPU,但没有任何运气。
注意:我使用的是4.5框架,IIS 8
我认为问题是FindMimeFromData()的签名。在此处查看PInvoke.net,以获取功能的正确签名:
http://www.pinvoke.net/default.aspx/urlmon/findmimefromdata.html
..so而不是pBC和ppwzMimeOut的uint,您将需要IntPtr!
也可以看看:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句