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]>
--~--~---------~--~----~------------~-------~--~----~
--
mono-cecil
-~----------~----~----~----~------~----~------~--~---