예제 #1
0
        public MSCabinet(string cabinetFilename)
        {
            LocalFilePath           = cabinetFilename;
            _pCabinetFilenamePinned = Marshal.StringToCoTaskMemAnsi(LocalFilePath);            // needs to be pinned as we use the address in unmanaged code.
            Decompressor            = MSCabDecompressor.CreateInstance();

            // open cabinet:
            _pNativeCabinet = NativeMethods.mspack_invoke_mscab_decompressor_open(Decompressor, _pCabinetFilenamePinned);
            if (_pNativeCabinet == IntPtr.Zero)
            {
                var lasterror = NativeMethods.mspack_invoke_mscab_decompressor_last_error(Decompressor);
                throw new Exception("Failed to open cabinet. Last error:" + lasterror);
            }
            //Marshal.PtrToStructure(_pNativeCabinet, _nativeCabinet);
            _nativeCabinet = (NativeMethods.mscabd_cabinet)Marshal.PtrToStructure(_pNativeCabinet, typeof(NativeMethods.mscabd_cabinet));
        }
예제 #2
0
        public void Close(bool isDisposing)
        {
            Debug.Print("Disposing MSCabinet for {0}. isDisposing:{1}", _cabinetFilename, isDisposing);
            if (_pNativeCabinet != IntPtr.Zero)
            {
                NativeMethods.mspack_invoke_mscab_decompressor_close(_pDecompressor, _pNativeCabinet);
                _pNativeCabinet = IntPtr.Zero;
            }

            if (_pDecompressor != IntPtr.Zero)
            {
                MSCabDecompressor.DestroyInstance(_pDecompressor);
                _pDecompressor = IntPtr.Zero;
            }
            if (_pCabinetFilenamePinned != IntPtr.Zero)
            {
                Marshal.FreeCoTaskMem(_pCabinetFilenamePinned);
                _pCabinetFilenamePinned = IntPtr.Zero;
            }
            GC.SuppressFinalize(this);
        }
예제 #3
0
        public MSCabinet(string cabinetFilename)
        {
                        #if NET_CORE
            cabinetFilename = $"\\\\?\\{cabinetFilename}";
                        #else
            cabinetFilename = new Path(cabinetFilename).WithWin32LongPathPrefix();
                        #endif

            _cabinetFilename        = cabinetFilename;
            _pCabinetFilenamePinned = Marshal.StringToCoTaskMemAnsi(_cabinetFilename);            // needs to be pinned as we use the address in unmanaged code.
            _pDecompressor          = MSCabDecompressor.CreateInstance();

            // open cabinet:
            _pNativeCabinet = NativeMethods.mspack_invoke_mscab_decompressor_open(_pDecompressor, _pCabinetFilenamePinned);
            if (_pNativeCabinet == IntPtr.Zero)
            {
                var lasterror = NativeMethods.mspack_invoke_mscab_decompressor_last_error(_pDecompressor);
                throw new Exception("Failed to open cabinet. Last error:" + lasterror);
            }
            //Marshal.PtrToStructure(_pNativeCabinet, _nativeCabinet);
            _nativeCabinet = (NativeMethods.mscabd_cabinet)Marshal.PtrToStructure(_pNativeCabinet, typeof(NativeMethods.mscabd_cabinet));
        }