Ah well then it looks like you're not creating a proper reference for
the ExceptionType of the exception handlers.

On Thu, Mar 13, 2014 at 6:54 PM, Daniel Wirtz <[email protected]> wrote:
> Hello Jb,
>
> what I am actually doing is to read IL from one assembly and put it into
> another. For that I wrote a method to move the IL around, injecting required
> additional local vars, preserving stack and local variable orders, which all
> works just fine with this sole exception.
>
> For normal methods I usually do exactly what you have suggested:
>
> newInst = proc.Create(inst.OpCode, targetAssembly.MainModule.Import(def));
>
> The code I posted includes lots of stuff I tried to circumvent the error.
>
> But, more interesting, I also did a few more tests. What actually works is
> importing the following:
>
> throw new Exception("test");
>
> But this doesn't work:
>
> try {
> throw new Exception("test");
> } catch (Exception ex) {
> }
>
> As this then throws the cecil exception from above. I am feeling somewhat
> lost right now :-)
>
> Daniel
>
> Am Donnerstag, 13. März 2014 17:29:29 UTC+1 schrieb Jb Evain:
>>
>> Hey Daniel,
>>
>> Are you sure this is going through this code path?
>>
>> Looking at the code, it's doing some superfluous work, but it doesn't
>> look wrong per se. From the look of the exception, there's a
>> TypeReference for System.Exception declared in the original module
>> that ends up in the tree of the targetAssembly.
>>
>> Also, any reason you couldn't write:
>>
>>
>>     newInst = proc.Create(inst.OpCode,
>> targetAssembly.MainModule.Import(def));
>>
>> ?
>>
>> Jb
>>
>>
>> On Thu, Mar 13, 2014 at 4:10 PM, Daniel Wirtz <[email protected]> wrote:
>> > Hello everyone,
>> >
>> > I just started using Cecil and it's a really powerful tool. Though I
>> > have
>> > got an issue with importing exceptions from a try-catch-block properly.
>> > All
>> > the other types seem to work fine, but exceptions use to cause trouble.
>> >
>> > What I basically have is a chunk of IL from another assembly that throws
>> > an
>> > Excetion:
>> >
>> > IL_0000: nop
>> > IL_0001: nop
>> > IL_0002: ldstr "test"
>> > IL_0007: newobj System.Void System.Exception::.ctor(System.String)
>> > IL_000c: throw
>> > IL_000d: stloc.0
>> > ...
>> >
>> > I then export the instruction's operand, which is the
>> > Exception(String,String) constructor, and declaring type, which is
>> > System.Exception, through looking it up:
>> >
>> > MethodDefinition def = (inst.Operand as MethodReference).Resolve();
>> > if (def.IsConstructor) {
>> > TypeDefinition classDef = (inst.Operand as
>> > MethodReference).DeclaringType.Resolve();
>> > targetAssembly.MainModule.Import(classDef);
>> > MethodDefinition ctorDef = GetConstructor(classDef, def);
>> > newInst = proc.Create(inst.OpCode,
>> > targetAssembly.MainModule.Import(ctorDef));
>> > }
>> >
>> > This works so far but when I call targetAssembly.Write(...) it raises
>> > the
>> > following exception:
>> >
>> > Error: System.ArgumentException: Member 'System.Exception' is declared
>> > in
>> > another module and needs to be imported
>> >   at Mono.Cecil.MetadataBuilder.LookupToken(IMetadataTokenProvider
>> > provider)
>> > in Mono.Cecil\AssemblyWriter.cs:line 1967.
>> >
>> > This doesn't seem to happen with anything else but exceptions. I'd be
>> > really
>> > happy for any ideas on what I might do wrong :-)
>> >
>> > --
>> > --
>> > --
>> > 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.

-- 
-- 
--
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