尝试读取或写入受保护的内存,由urlmon.dll引起。

3
我可以帮您翻译成中文,以下是翻译的结果:

我知道这个问题已经被问了很多次,但不幸的是我还没有找到解决方法。我正在使用 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);

我尝试取消勾选“在模块加载时抑制JIT优化”选项,但没有成功。 还尝试将构建改为x86而不是任何CPU,但也没有成功。

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

1个回答

6

2
感谢您提供的解决方案。我今天必须使用它,它完美地运行了。 - Sheep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接