コード例 #1
0
ファイル: MetaDataManager.cs プロジェクト: maresja1/SDenc
        /// <summary>
        /// Creates copy of read-only metadata of runnig assembly to enable changes.
        /// </summary>
        /// <param name="roEmitter">Read-only version of metadata.</param>
        /// <returns>Editable copy of metadata.</returns>

        private unsafe IMetaDataEmit createEmitterCopy(IMetaDataEmit roEmitter)
        {
            Object objDispenser, objEmitter = null;
            ulong  saveSize;

            byte[] metadataBuffer;

            roEmitter.GetSaveSize((uint)CorSaveSize.cssAccurate, out saveSize);
            metadataBuffer = new byte[saveSize];
            roEmitter.SaveToMemory(metadataBuffer, saveSize);

            int hResult = NativeMethods.CoCreateInstance(ref dispenserClassID, null, 1, ref dispenserIID, out objDispenser);

            if (hResult == 0)
            {
                IMetaDataDispenser dispenser = (IMetaDataDispenser)objDispenser;

                UInt32 fVal = 0x01;
                object val  = (object)fVal;
                dispenser.SetOption(ref metaDataSetENC, ref val);
                fixed(byte *buff = metadataBuffer)
                {
                    dispenser.OpenScopeOnMemory(new IntPtr(buff), (uint)metadataBuffer.Length, CorOpenFlags.ofRead, ref emitterIID, out objEmitter);
                }

                oldDispenser = dispenser;
            }
            return((IMetaDataEmit)objEmitter);
        }
コード例 #2
0
ファイル: MetaDataManager.cs プロジェクト: maresja1/SDenc
        /// <summary>
        /// Creates copy of read-only metadata of runnig assembly to enable changes.
        /// </summary>
        /// <param name="roEmitter">Read-only version of metadata.</param>
        /// <returns>Editable copy of metadata.</returns>
        private unsafe IMetaDataEmit createEmitterCopy(IMetaDataEmit roEmitter)
        {
            Object objDispenser, objEmitter = null;
            ulong saveSize;
            byte[] metadataBuffer;

            roEmitter.GetSaveSize((uint)CorSaveSize.cssAccurate,out saveSize);
            metadataBuffer = new byte[saveSize];
            roEmitter.SaveToMemory(metadataBuffer, saveSize);

            int hResult = NativeMethods.CoCreateInstance(ref dispenserClassID, null, 1, ref dispenserIID, out objDispenser);
            if (hResult == 0)
            {
                IMetaDataDispenser dispenser = (IMetaDataDispenser)objDispenser;

                UInt32 fVal = 0x01;
                object val = (object)fVal;
                dispenser.SetOption(ref metaDataSetENC, ref val);
                fixed(byte* buff = metadataBuffer){
                    dispenser.OpenScopeOnMemory(new IntPtr(buff), (uint)metadataBuffer.Length,CorOpenFlags.ofRead, ref emitterIID, out objEmitter);
                }
                oldDispenser = dispenser;
            }
            return (IMetaDataEmit)objEmitter;
        }