gpt4 book ai didi

c# - 在 ASP.Net 应用程序中调用非托管代码时获取 protected 内存异常

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

我从另一个 StackOverflow 答案中找到了一些代码,用于根据从文件的前几个字节读取的内容来发现文件的 MIME 类型。该代码引用了外部 DLL 中的非托管方法。

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static System.UInt32 FindMimeFromData(
System.UInt32 pBC,
[MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
System.UInt32 cbSize,
[MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
System.UInt32 dwMimeFlags,
out System.UInt32 ppwzMimeOut,
System.UInt32 dwReserverd
);

我调用此方法,它返回一个 IntPtr,并使用 Marshal.PtrToStringUni 读取存储在指定内存地址的字符串。

System.UInt32 mimetype = 0;
FindMimeFromData(0, null, buffer, maxBytes, null, 0, out mimetype, 0);
System.IntPtr mimeTypePtr = new IntPtr(mimetype);
string mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);

请注意,maxBytes 被硬编码为 256,缓冲区最多容纳被检查文件的前 256 个字节。

调用 Marshal.PtrToStringUni(mimeTypePtr) 会抛出 AccessViolationException 并显示消息“尝试读取或写入 protected 内存。这通常表示其他内存已损坏。”

在 Windows 窗体或控制台应用程序中使用时逻辑工作正常,因此它似乎是一些仅适用于 ASP.Net 应用程序的安全措施。有谁知道从 ASP.Net 调用这个非托管方法需要什么?我还会选择一种更好的方法来派生不涉及使用 Windows 注册表的文件的 MIME 类型。我在使用 Registry 时遇到了一些问题,我正试图让它在我不能依赖 Registry 的时候作为故障转移工作。

最佳答案

这个确切的场景在对问题 here 的评论中实际解决了.使用 pinvoke.net 上显示的 FindMimeFromData 方法的签名解决了我的问题。感谢@Rohland 的原始评论和@MikeHixson 为我指明了正确的方向。

关于c# - 在 ASP.Net 应用程序中调用非托管代码时获取 protected 内存异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317115/

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