Hi JB,

I have a class Logger with method LogText. This is to log text. I have 
another class Math and has method add.

I am trying to inject Logger.LogText method call in the add method. Here is 
the code. 

if (m.Name.Equals("add", StringComparison.CurrentCultureIgnoreCase))

{

       methodILProcessor = m.Body.GetILProcessor();

       Instruction instrMsg = methodILProcessor.Create(OpCodes.Ldstr, "method 
- add()");

       m.Body.Instructions.Insert(0, instrMsg);

       Type classObj = getType("Logger");//get type using reflection

       TypeReference typeRef = type.Module.Import(classObj);

       MethodReference logMethodRef = 
assembly.MainModule.Import(classObj.GetMethod("LogText", new Type[] { typeof
(string) }));

       m.Body.Instructions.Insert(1, Instruction.Create(OpCodes.Call, 
logMethodRef));

}

While saving assembly, getting error as below. Can you please help and 
suggest where I am doing wrong?

System.Void MyApp.Logger::LogText(System.String)' is declared in another 
module and needs to be imported

Thanks
Venu

On Monday, February 27, 2012 at 8:51:34 PM UTC+5:30, Remy Blok wrote:

> I have a class with a default constructor. Based on an assembly 
> attribute I'm trying to change the default constructor with additional 
> arguments. The type of the arguments I'm adding is located in a 
> different assembly. 
> When I've change the assembly and try to save it I get an exception, 
> which I cannot seem to fix: Member 'OtherAssembly.IViewModel' is 
> declared in another module and needs to be imported. 
>
> The assembly that contains the Type is referenced by the assembly I'm 
> changing. I also see this in the AssemblyReferences in the current 
> module. I'm importing the Type into the current module when I get the 
> TypeReference out of the Attribute. 
>
> It is probably someting simple but I can't seem to find it. What Am I 
> doing wrong? 
> Thanks for your help! 
>
> Below the code I'm using to test the issue. 
> Assembly "Views.dll" I'm changing contains: 
>
> public class Class1 
> { 
>         public Class1() { } 
> } 
>
> [assembly: OtherAssembly.ViewModel(typeof(Class1), 
> typeof(OtherAssembly.IViewModel))] 
>
>
> The "OtherAssembly" I'm referencing contains: 
>
> namespace OtherAssembly 
> { 
>         public interface IViewModel { } 
>
>         [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 
>         public class ViewModelAttribute : Attribute 
>         { 
>                 public ViewModelAttribute(Type viewType, Type 
> viewModelType) { } 
>         } 
> } 
>
> The Code I'm using in a separate tool to change the assembly: 
>
> var module = ModuleDefinition.ReadModule("Views.dll"); 
>
> //load Assembly attribute 
> var attribute = module.Assembly.CustomAttributes.First(a => 
> a.Constructor.DeclaringType.FullName == 
> "OtherAssembly.ViewModelAttribute"); 
> var customAttributeArguments = attribute.ConstructorArguments; 
>
> //get Arguments from the attribute 
> var viewType = 
> module.Import((TypeReference)customAttributeArguments[0].Value).Resolve(); 
> // 
> Resolves Class1 
> var viewModelType = 
> module.Import((TypeReference)customAttributeArguments[1].Value).Resolve(); 
> // 
> Resolves OtherAssembly.IViewModel 
>
> //find the constructor of "Class1" 
> var ctor = viewType.Methods.First(m => m.IsConstructor && !m.IsStatic 
> && m.Parameters.Count == 0); 
>
> //add "OtherAssembly.IViewModel" parameter to constructor 
> var viewModelTypeParameter = new ParameterDefinition(viewModelType); 
> ctor.Parameters.Add(viewModelTypeParameter); 
>
> //write causes exception: Member 'OtherAssembly.IViewModel' is 
> declared in another module and needs to be imported 
> module.Write("Views2.dll");

-- 
-- 
--
mono-cecil
--- 
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to