コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }