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