What about providing the full source?
On 10/24/07, Philip_L <[EMAIL PROTECTED]> wrote:
>
> Well, I already imported both types into the module, and it still
> doesn't seem to be working. Any other ideas? I'm practically stumped
> here. :/
>
> On Oct 24, 10:07 pm, "Jb Evain" <[EMAIL PROTECTED]> wrote:
> > Hey,
> >
> > This kind of thing usually works well.
> >
> > It may depend on if you got:
> >
> > _modifiedInterfaceType and _aopHostType correct.
> >
> > Jb
> >
> > On 10/24/07, Philip_L <[EMAIL PROTECTED]> wrote:
> >
> >
> >
> >
> >
> > > I can't figure out why, but every time I try to modify an existing
> > > type in the assembly with the following code:
> >
> > > ...
> > > _hostField = new FieldDefinition("__host", _aopHostType,
> > > FieldAttributes.Private);
> > > typeDef.Fields.Add(_hostField);
> >
> > > // Implement IModifiedType
> > > if (typeDef.Interfaces.Contains(_modifiedInterfaceType))
> > > return;
> >
> > > typeDef.Interfaces.Add(_modifiedInterfaceType);
> >
> > > MethodAttributes attributes = MethodAttributes.Public |
> > > MethodAttributes.HideBySig |
> > > MethodAttributes.SpecialName
> > > | MethodAttributes.NewSlot |
> > > MethodAttributes.Virtual;
> >
> > > // Implement the getter property
> > > _getHost = new MethodDefinition("get_Host", attributes,
> > > _aopHostType);
> > > _getHost.ImplAttributes = MethodImplAttributes.Managed |
> > > MethodImplAttributes.IL;
> > > CilWorker IL = _getHost.Body.CilWorker;
> > > IL.Emit(OpCodes.Ldarg_0);
> > > IL.Emit(OpCodes.Ldfld, _hostField);
> > > IL.Emit(OpCodes.Ret);
> >
> > > // Implement the setter
> > > _setHost = new MethodDefinition("set_Host", attributes,
> > > _voidType);
> > > _setHost.ImplAttributes = MethodImplAttributes.Managed |
> > > MethodImplAttributes.IL;
> > > _setHost.Parameters.Add(new
> > > ParameterDefinition(_aopHostType));
> >
> > > IL = _setHost.Body.CilWorker;
> > > IL.Emit(OpCodes.Ldarg_0);
> > > IL.Emit(OpCodes.Ldarg_1);
> > > IL.Emit(OpCodes.Stfld, _hostField);
> > > IL.Emit(OpCodes.Ret);
> >
> > > PropertyDefinition hostProperty =
> > > new PropertyDefinition("Host", _aopHostType,
> > > PropertyAttributes.Unused);
> >
> > > _getHost.IsPublic = true;
> > > _setHost.IsPublic = true;
> >
> > > hostProperty.GetMethod = _getHost;
> > > hostProperty.SetMethod = _setHost;
> >
> > > typeDef.Methods.Add(_getHost);
> > > typeDef.Methods.Add(_setHost);
> > > typeDef.Properties.Add(hostProperty);
> > > ...
> >
> > > After saving the modified assembly, I keep getting this error from
> > > PEVerify:
> > > ---------------------------------------Error
> > > Message---------------------------------------
> > > Microsoft (R) .NET Framework PE Verifier. Version 2.0.50727.42
> > > Copyright (c) Microsoft Corporation. All rights reserved.
> >
> > > [token 0x02000002] Type load failed.
> > > 1 Error Verifying testlibrary.dll
> > > ---------------------------------------Error
> > > Message---------------------------------------
> >
> > > Is this a bug, or am I doing something wrong here? I thought this was
> > > the most straightforward way to add an interface implementation to an
> > > existing class, and I'm not sure whether this is a bug or not. Anyone
> > > have any ideas?
> >
> > > Thanks in advance.
> >
> > > Regards,
> >
> > > Philip
> >
> > --
> > Jb Evain <[EMAIL PROTECTED]>
>
>
> >
>
--
Jb Evain <[EMAIL PROTECTED]>
--~--~---------~--~----~------------~-------~--~----~
--
mono-cecil
-~----------~----~----~----~------~----~------~--~---