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

Suppress JIT optimization on module load" " オプションのチェックを外そうとしましたが、うまくいきませんでした。また、ビルドを任意の CPU の代わりに x86 に変更しようとしましたが、うまくいきませんでした。

:私は4.5フレームワーク、IIS 8を使用しています

4

1 に答える 1

6

問題は FindMimeFromData() の署名だと思います。関数の正しい署名については、PInvoke.net を参照してください。

http://www.pinvoke.net/default.aspx/urlmon/findmimefromdata.html

..pBC と ppwzMimeOut の uint の代わりに、IntPtr が必要になります。

以下も参照してください。

urlmon.dll FindMimeFromData() は 64 ビットのデスクトップ/コンソールでは完全に動作しますが、ASP.NET ではエラーが発生します

于 2014-09-26T13:51:41.263 に答える