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