Re: [mono-cecil] "Error 'System.Void Mono.Cecil.AssemblyDefinition::.ctor()' is declared in another module and needs to be imported"

94 views
Skip to first unread message

Jb Evain

unread,
Oct 12, 2012, 8:57:27 AM10/12/12
to mono-...@googlegroups.com
Hi,

I figured I'd answer on SO as it has better googlability.

http://stackoverflow.com/questions/12859040/error-system-void-mono-cecil-assemblydefinition-ctor-is-declared-in-anoth/12859571#12859571

On Oct 12, 2012, at 2:36 PM, Murugan wrote:

> Hi Everyone,
> I am using latest version of Mono.cecil
> What I am trying to do is I am having Custom Attributes in a seperate dll and I want to add the attributes to every method in the sample.exe using mono.cecil
> but i am getting the error
>
> "Error 'System.Void Mono.Cecil.AssemblyDefinition::.ctor()' is declared in another module and needs to be imported"
>
>
> Can any one help me in resolving it?
>
> Expecting your help.....
>
> //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 ()
> {
> }
>
>
> }
> }
>
>
>
>
> --
> --
> mono-cecil

Murugan

unread,
Oct 12, 2012, 10:47:47 AM10/12/12
to mono-...@googlegroups.com
That worked like charm, thanks a lot
Reply all
Reply to author
Forward
0 new messages