由 urlmon.dll 引起的“试图读取或写入受保护的内存”

Posted

技术标签:

【中文标题】由 urlmon.dll 引起的“试图读取或写入受保护的内存”【英文标题】:"Attempted to read or write protected memory" caused by urlmon.dll 【发布时间】:2014-11-21 12:25:54 【问题描述】:

我知道这已被问过很多次,但不幸的是我没有找到解决问题的方法,我正在使用urlmon.dll 从字节数组中查找 MIME 类型,但我收到 IIS 进程崩溃@ 987654322@

试图读取或写入受保护的内存。这通常表明其他内存已损坏。

代码:

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 而不是 Any CPU,但没有任何运气。

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

【问题讨论】:

【参考方案1】:

我认为问题在于 FindMimeFromData() 的签名。在 PInvoke.net 上查看函数的正确签名:

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

..so 而不是 uint 用于 pBC 和 ppwzMimeOut 你将需要 IntPtr!

另见:

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

【讨论】:

感谢您的解决方案。我今天必须使用它,而且效果很好。

以上是关于由 urlmon.dll 引起的“试图读取或写入受保护的内存”的主要内容,如果未能解决你的问题,请参考以下文章

PInvoke“试图读取或写入受保护的内存”

LinQ 试图读取或写入受保护的内存。这通常表明其他内存已损坏

VB.NET 访问 - 试图读取或写入受保护的内存

“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

错误“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

试图读取或写入受保护的内存-Sql Compact 和 .NEt