升级.NET时,P / Invoke抛出System.ExecutionEngineException(3.5 - > 4.5)

时间:2015-12-10 09:42:35

标签: c# .net pinvoke

我正在使用nsis7z.dll来提取7z文件。代码在.NET 3.5上运行得很好,但是当我使用.NET 4.5进行编译时,它确实提取了7z文件,但之后因System.ExecutionEngineException异常而崩溃。从我搜索到的内容来看,使用P / Invoke发送的参数似乎存在问题,主要是作为参考传递的参数。

代码:

        public static bool ExtractNsis7z(string i_FileName, string i_ToDirectory)
    {
        IntPtr ptr = GlobalAlloc((uint)GlobalMemoryFlags.GPTR, (UIntPtr)Marshal.SizeOf(typeof(stack)));

        stack st = (stack)Marshal.PtrToStructure(ptr, typeof(stack));

        st.next = IntPtr.Zero;

        for (int i = 0; i < i_FileName.Length && (i < st.text.Length - 1); i++)
        {
            st.text[i] = i_FileName[i];
        }

        return Extract7z(IntPtr.Zero, 0, i_ToDirectory, ref st, IntPtr.Zero);
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public class stack
    {
        public IntPtr next;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
        public char[] text;

    };
    [DllImport("nsis7z.dll", EntryPoint = "Extract", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
    static extern bool Extract7z(IntPtr hWnd, Int32 stringSize, String outputDirectory, ref stack theStack, IntPtr extra);


    enum GlobalMemoryFlags : uint
    {
        GMEM_FIXED = 0x0000,
        GMEM_MOVEABLE = 0x0002,
        GMEM_ZEROINIT = 0x0040,
        GMEM_MODIFY = 0x0080,
        GMEM_VALID_FLAGS = 0x7F72,
        GMEM_INVALID_HANDLE = 0x8000,
        GHND = (GMEM_MOVEABLE | GMEM_ZEROINIT),
        GPTR = (GMEM_FIXED | GMEM_ZEROINIT),
        /*The following values are obsolete, but are provided for compatibility with 16-bit Windows. They are ignored.*/
        GMEM_DDESHARE = 0x2000,
        GMEM_DISCARDABLE = 0x0100,
        GMEM_LOWER = GMEM_NOT_BANKED,
        GMEM_NOCOMPACT = 0x0010,
        GMEM_NODISCARD = 0x0020,
        GMEM_NOT_BANKED = 0x1000,
        GMEM_NOTIFY = 0x4000,
        GMEM_SHARE = 0x2000
    }

    [DllImport("kernel32.dll")]
    static extern IntPtr GlobalAlloc(uint uFlags, UIntPtr dwBytes);

0 个答案:

没有答案