Hi, Unfortunately it's hard to say just from this code. The logical explanation would be that the module you're using to Import a reference is not the one you're using the reference into.
Jb On Sun, Sep 10, 2017 at 7:29 PM, venu gopal Yela <[email protected]> wrote: > 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. > -- -- -- 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.
