Thank you JB!

Got it. Method should be imported from Class.

On Mon, Sep 11, 2017 at 9:57 PM, Jb Evain <[email protected]> wrote:

> 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(cla
>> ssObj.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 a topic in the
> Google Groups "mono-cecil" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/mono-cecil/E_dlFgLDPjc/unsubscribe.
> To unsubscribe from this group and all its topics, 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.

Reply via email to