コード例 #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
ファイル: SymbolWriter.cs プロジェクト: maresja1/SDenc
        /// <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);
            }
        }
コード例 #3
0
 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();
 }
コード例 #4
0
ファイル: IMetadata.cs プロジェクト: taktopiyush/cci
 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();
 }
コード例 #5
0
ファイル: ModuleMetadata.cs プロジェクト: atykhyy/cecil
 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 ();
 }
コード例 #6
0
 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();
 }
コード例 #7
0
ファイル: SymbolWriter.cs プロジェクト: maresja1/SDenc
        /// <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);
            }
        }
コード例 #8
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;
        }
コード例 #9
0
 public MetaDataEmitter(IMetaDataEmit emitter)
 {
     this.emitter = emitter;
 }
コード例 #10
0
ファイル: MetaDataEmitter.cs プロジェクト: maresja1/SDenc
 public MetaDataEmitter(IMetaDataEmit emitter)
 {
     this.emitter = emitter;
 }