2012-10-12 27 views
3

我正在使用最新版本的Mono.cecil 我想要做的是我我有一個單獨的dll中的自定義屬性,我想使用mono.cecil 添加屬性到sample.exe中的每個方法,但我得到錯誤「錯誤'System.Void Mono.Cecil.AssemblyDefinition ::。ctor()'在另一個模塊中聲明並需要導入」

「錯誤」System.Void Mono.Cecil.AssemblyDefinition: :.ctor()'在另一個模塊中聲明,需要導入「

任何人都可以幫我解決它嗎?

期待您的幫助.....

 //Main File Sample.exe 

class SampleItems 
    { 

    public static void Main() 
    { 
    } 
    public void Sample() 
    { 
     Console.WriteLine("sample"); 
    } 

    public void Sample1() 
    { 
    Console .WriteLine ("sample1"); 
    } 
    } 

=============================== =

Seperate application applying the custom attribute 

static void Main(string[] args) 
    { 
     //opens the assembly 
     AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(@"E:\MONOCECIL\POC SAMPLES\Sample.exe.exe"); 

     //AssemblyDefinition as1= AssemblyDefinition .ReadAssembly (@"E:\MONOCECIL\POC SAMPLES\MonoStart\MonoStart\bin\Debug\SampleDll.dll"); 

     var resolver = new DefaultAssemblyResolver(); 
     var systemName = AssemblyNameReference.Parse("SampleDll"); 

     AssemblyDefinition as1 = resolver.Resolve(systemName); 

     var ty = assemblyDefinition.MainModule.Import(as1.GetType()); 

     var attCtor = ty.Resolve().Methods.First(x => x.Name == ".ctor" 
    && x.Parameters.Count == 0); 


foreach (var modDef in assemblyDefinition.Modules) 
     { 

     foreach (var typeDef in modDef.Types) 
     { 
      Console.WriteLine(" +--Type {0}", typeDef.Name); 

      //All methods in this type 
      foreach (var methodDef in typeDef.Methods) 
      { 
      var custatt = new CustomAttribute(attCtor); 
      methodDef.CustomAttributes.Add(custatt); 

      Console.WriteLine("  --Method {0}", methodDef.Name); 
      } 


     } 
     } 

     assemblyDefinition.Write(@"E:\POSTSHARP SAMPLES\ASPECTDNG\Debug\Sampleupdate.exe"); 
     Console .ReadLine(); 
    } 

=============================== 
Sample dll 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SampleDll 
{ 
[System.AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=false)] 
    public sealed class SampleClass :Attribute 

    { 

    public SampleClass() 
    { 
    } 


    } 
} 

回答

4

的問題是,該行:

var ty = assemblyDefinition.MainModule.Import(as1.GetType()); 
var attCtor = ty.Resolve().Methods.First(x => x.Name == ".ctor" && x.Parameters.Count == 0); 

使絕對沒有任何意義。

讓說你有:

var sampleDll = AssemblyDefinition.ReadAssembly ("SampleDll.dll"); 
var targetExe = AssemblyDefiniion.ReadAssembly ("SampleExe.exe"); 

而且要在SampleExe.exe每個類型添加[SampleClass]

您需要sampleDll創建從SampleClass類型的引用到targetExe

var sampleClass = sampleDll.MainModule.GetType ("SampleClass"); 
var sampleClassCtor = sampleClass.Methods.First(m => m.IsConstructor); 

var ctorReference = targetExe.MainModule.Import (sampleClassCtor); 

foreach (var type in targetExe.MainModule.Types) 
    type.CustomAttributes.Add (new CustomAttribute (ctorReference)); 
+0

謝謝主席先生,我一直在尋找這樣一個很長的時間非常感謝你的指導,還有一件事,先生,我將ASPECTDNG轉換爲支持最新版本的Mono.cecil.9,您可以在轉換過程中指導嗎?此外,我在轉換期間面臨的問題很少... –

+0

@MuruganAlagesan請將問題標記爲已回答。關於AspectDNG轉換,恐怕我現在沒有時間了。但是,如果您有任何問題,我一定會幫助解決單塞西集團的問題。 –

相關問題