public MetadataFile OpenFileAsFileMapping(string fileName) { MetadataFile metadataFileAndRvaResolver; FileMapping fileMapping = new FileMapping(fileName); MetadataDispenser.IMetaDataDispenserEx dispenserShim = MetadataDispenser.GetDispenserShim(); Guid gUID = typeof(MetadataDispenser.IMetadataImportDummy).GUID; IntPtr zero = IntPtr.Zero; try { IntPtr baseAddress = fileMapping.BaseAddress; uint length = (uint)fileMapping.Length; int num = dispenserShim.OpenScopeOnMemory(baseAddress, length, MetadataDispenser.CorOpenFlags.ReadOnly, ref gUID, out zero); Marshal.ThrowExceptionForHR(num); GC.KeepAlive(dispenserShim); Marshal.FinalReleaseComObject(dispenserShim); dispenserShim = null; metadataFileAndRvaResolver = new MetadataFileAndRvaResolver(zero, fileMapping); } finally { if (zero != IntPtr.Zero) { Marshal.Release(zero); } } return(metadataFileAndRvaResolver); }
public MetadataFile OpenFromByteArray(byte[] data) { MetadataFile metadataFileOnByteArray; data = (byte[])data.Clone(); MetadataDispenser.IMetaDataDispenserEx dispenserShim = MetadataDispenser.GetDispenserShim(); Guid gUID = typeof(MetadataDispenser.IMetadataImportDummy).GUID; IntPtr zero = IntPtr.Zero; GCHandle gCHandle = new GCHandle(); try { gCHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr intPtr = Marshal.UnsafeAddrOfPinnedArrayElement(data, 0); uint length = (uint)data.Length; int num = dispenserShim.OpenScopeOnMemory(intPtr, length, MetadataDispenser.CorOpenFlags.ReadOnly, ref gUID, out zero); Marshal.ThrowExceptionForHR(num); GC.KeepAlive(dispenserShim); Marshal.FinalReleaseComObject(dispenserShim); dispenserShim = null; metadataFileOnByteArray = new MetadataDispenser.MetadataFileOnByteArray(ref gCHandle, zero); } finally { if (gCHandle.IsAllocated) { gCHandle.Free(); } if (zero != IntPtr.Zero) { Marshal.Release(zero); } } return(metadataFileOnByteArray); }
public MetadataFile OpenFile(string fileName) { MetadataFile metadataFile; MetadataDispenser.IMetaDataDispenserEx dispenserShim = MetadataDispenser.GetDispenserShim(); Guid gUID = typeof(MetadataDispenser.IMetadataImportDummy).GUID; IntPtr zero = IntPtr.Zero; try { int num = dispenserShim.OpenScope(fileName, MetadataDispenser.CorOpenFlags.ReadOnly, ref gUID, out zero); Marshal.ThrowExceptionForHR(num); GC.KeepAlive(dispenserShim); Marshal.FinalReleaseComObject(dispenserShim); dispenserShim = null; metadataFile = new MetadataFile(zero); } finally { if (zero != IntPtr.Zero) { Marshal.Release(zero); } } return(metadataFile); }