Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;试图读取或写入受保护内存“;由urlmon.dll引起_C#_Iis_Urlmon - Fatal编程技术网

C# &引用;试图读取或写入受保护内存“;由urlmon.dll引起

C# &引用;试图读取或写入受保护内存“;由urlmon.dll引起,c#,iis,urlmon,C#,Iis,Urlmon,我知道这个问题已经被问了很多次,但不幸的是,我还没有找到解决问题的方法,我正在使用urlmon.dll从字节数组中查找MIME类型,但是我收到了IIS进程w3wp.exe 试图读取或写入受保护的内存。这通常表示其他内存已损坏 守则: public static int MimeSampleSize = 256; public static string DefaultMimeType = "application/octet-stream"; [DllImport(@"urlmon.dll"

我知道这个问题已经被问了很多次,但不幸的是,我还没有找到解决问题的方法,我正在使用
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;
    }
}
我尝试取消选中“
在模块加载时抑制JIT优化”
”选项,但没有成功。 还试图在没有任何运气的情况下将构建更改为x86而不是任何CPU


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

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

…因此,您将需要IntPtr,而不是pBC和ppwzMimeOut的uint

另见:


谢谢您的解决方案。我今天不得不使用它,它工作得非常好。
var mime = Marshal.PtrToStringUni(mimePointer);