/// <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> /// Initialize's instances of <c>ISymUnmanagedReader</c> and <c>ISymUnmanagedWriter</c> interfaces. /// The first is used to read symbols from the new assembly and second for writing part of it with tokens /// relative to the old assembly. /// </summary> /// <param name="oldEmitter"><c>IMetaDataEmit</c> instance relative to the old running assembly.</param> /// <param name="newImporter"><c>IMetaDataImport</c> instance relative to the new background-compiled assembly.</param> public void Initialize(IMetaDataEmit oldEmitter, IMetaDataImport newImporter) { DeltaPDBPath = manager.ResourceManager.TemporaryPath + "temp"; IntPtr pFilename = Marshal.StringToCoTaskMemUni(manager.ResourceManager.NewAssemblyPath); IntPtr pFilename2 = Marshal.StringToCoTaskMemUni(DeltaPDBPath + ".exe"); IntPtr pPath = Marshal.StringToCoTaskMemUni(""); try { mReader.Initialize(newImporter, pFilename, pPath, null); mWriter.Initialize(oldEmitter, pFilename2, stream, 0); State = WriterState.Building; } catch (System.Exception e) { throw new TranslatingException(DeltaPDBPath + ";" + e.Message); } finally { Marshal.FreeCoTaskMem(pFilename2); Marshal.FreeCoTaskMem(pFilename); Marshal.FreeCoTaskMem(pPath); } }
public uint TranslateSigWithScope(IntPtr pAssemImport, IntPtr pbHashValue, uint cbHashValue, IMetaDataImport import, IntPtr pbSigBlob, uint cbSigBlob, IntPtr pAssemEmit, IMetaDataEmit emit, IntPtr pvTranslatedSig, uint cbTranslatedSigMax) { throw new NotImplementedException(); }
unsafe uint IMetaDataEmit.TranslateSigWithScope(IntPtr pAssemImport, void *pbHashValue, uint cbHashValue, IMetaDataImport import, byte *pbSigBlob, uint cbSigBlob, IntPtr pAssemEmit, IMetaDataEmit emit, byte *pvTranslatedSig, uint cbTranslatedSigMax) { throw new NotImplementedException(); }
public uint TranslateSigWithScope(IntPtr pAssemImport, IntPtr pbHashValue, uint cbHashValue, IMetaDataImport import, IntPtr pbSigBlob, uint cbSigBlob, IntPtr pAssemEmit, IMetaDataEmit emit, IntPtr pvTranslatedSig, uint cbTranslatedSigMax) { throw new NotImplementedException (); }
unsafe uint IMetaDataEmit.TranslateSigWithScope(IntPtr pointerAssemImport, void *bytePointerHashValue, uint byteCountHashValue, IMetaDataImport import, byte *bytePointerSigBlob, uint byteCountSigBlob, IntPtr pointerAssemEmit, IMetaDataEmit emit, byte *voidPointerTranslatedSig, uint byteCountTranslatedSigMax) { throw new NotImplementedException(); }
/// <summary> /// Initialize's instances of <c>ISymUnmanagedReader</c> and <c>ISymUnmanagedWriter</c> interfaces. /// The first is used to read symbols from the new assembly and second for writing part of it with tokens /// relative to the old assembly. /// </summary> /// <param name="oldEmitter"><c>IMetaDataEmit</c> instance relative to the old running assembly.</param> /// <param name="newImporter"><c>IMetaDataImport</c> instance relative to the new background-compiled assembly.</param> public void Initialize(IMetaDataEmit oldEmitter,IMetaDataImport newImporter) { DeltaPDBPath = manager.ResourceManager.TemporaryPath + "temp"; IntPtr pFilename = Marshal.StringToCoTaskMemUni(manager.ResourceManager.NewAssemblyPath); IntPtr pFilename2 = Marshal.StringToCoTaskMemUni(DeltaPDBPath + ".exe"); IntPtr pPath = Marshal.StringToCoTaskMemUni(""); try { mReader.Initialize(newImporter, pFilename, pPath, null); mWriter.Initialize(oldEmitter, pFilename2, stream, 0); State = WriterState.Building; } catch (System.Exception e) { throw new TranslatingException(DeltaPDBPath + ";" + e.Message) ; } finally { Marshal.FreeCoTaskMem(pFilename2); Marshal.FreeCoTaskMem(pFilename); Marshal.FreeCoTaskMem(pPath); } }
/// <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; }
public MetaDataEmitter(IMetaDataEmit emitter) { this.emitter = emitter; }