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);