gpt4 book ai didi

c# - "Attempted to read or write protected memory"由 urlmon.dll 引起

转载 作者:行者123 更新时间:2023-11-30 15:28:12 24 4
gpt4 key购买 nike

我知道这个问题已经被问过很多次了,但遗憾的是我还没有找到解决问题的方法,我正在使用 urlmon.dll 从字节数组中查找 MIME 类型,但我收到了IIS 进程 w3wp.exe

崩溃

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

代码:

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

..因此,对于 pBC 和 ppwzMimeOut,您将需要 IntPtr 而不是 uint!

另见:

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

关于c# - "Attempted to read or write protected memory"由 urlmon.dll 引起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26060460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com