Hey David,

I'm thinking about something.

Custom Attributes including types are encoded in the metadata in a brain
dead manner: using strings.

To optimize memory, Cecil will try to round trip custom attributes as a
byte array without decoding how the custom attribute is encoded.

So if you have a: [Foo(typeof(Bar))],

The reference to Bar will be encoded as a string, including its public key
token.

So basically, you might need to iterate over everything that has a
CustomAttribute, and access its .CustomAttributes collection before
changing the AssemblyNameReferences. That will load the custom attributes,
and load the string Type as a TypeReferencec.

Jb

On Wed, Jan 31, 2018 at 4:32 AM, Molowe <david.checa...@gmail.com> wrote:

> Hi again,
>
> After a little testing it seems that this logic write the desired info at
> assembly metadata :
>
>  (replacing the one related with custom attributes of previous
> code-snipped)
>
>                             ExportedType exportedType = new ExportedType(
>                                   typeForwardToReference.Namespace,
>                                   typeForwardToReference.Name,
>                                   referAssembly.MainModule,
>                                   typeForwardToReference.Scope)
>                             {
>                                 Attributes = TypeAttributes.Forwarder
>                             };
>
>                             targetAssembly.MainModule.ExportedTypes.Add(
> exportedType);
>                              //... save assembly, etc....
>
>
> outputs:
>
> .class extern forwarder System.Web.Mvc.TagBuilder
> {
>   .assembly extern System.Web.WebPages
> }
>
> .class extern forwarder System.Web.Mvc.TagRenderMode
> {
>   .assembly extern System.Web.WebPages
> }
>
> etc.....
>
> *First question* : metadata for forwards seems to be ok,......It is also
> necessary to add any manual-attributes-logic as in first approach  ?
>
> *Second* : Original error message is still there :
>
> *Unable to load type 'System.Web.WebPages.PreApplicationStartCode' of
> assembly  'System, Version=4.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089'.*
>
> So I guess that now it´s time to focus on PreApplicationStartMethod
> assembly attribute : [assembly: 
> PreApplicationStartMethod(typeof(PreApplicationStartCode),
> "Start")]
>
> At first look we see a clear dependency of System.Web.  Any suggestion
> about how to proceed with it ?
>
>
> Thanks a lot !!
> David
>
>
>
> El miércoles, 31 de enero de 2018, 8:42:35 (UTC+1), Molowe escribió:
>>
>> Hi again,
>>
>> I have found info about to TypeForwardedToAttribute at
>> module.ExportedTypes ....
>>
>> As I have commented previously, after strong-name deletion of the friend
>> assembly System.Web.Webpages.dll and re-mapping  reference from
>> System.Web.Mvc.dll, TypeForwardedToAttributes at metadata becomes into:
>>
>> .class extern forwarder System.Web.Mvc.TagBuilder
>> {
>>   .assembly extern System
>> }
>>
>> Nevertheless, when I load ExportedTypes, scope property seems to point
>> out to previous version of System.Web.Webpages.dll (preserving
>> PublicKeyToke)
>>
>> I guess that next step will be delete all this info, and create new
>> exported types.....  Is that correct?
>>
>> In addition....It´s also needed to create custom
>> TypeForwardedToAttribute´s ?
>>
>>
>> So far, I have used this logic without success :
>>
>>                 // targetAssembly = [System.Web.Mvc]
>>                 AssemblyDefinition referAssembly =
>> AssemblyDefinition.ReadAssembly([System.Web.WebPages.Path]);
>>                 foreach (var typeForwardToLiteral in typesToBeForward)
>>                 {
>>                     var typeForwardToDefinition =
>> referAssembly.MainModule.Types.Where(o => o.Name ==
>> typeForwardToLiteral).FirstOrDefault();
>>                     var typeForwardToReference =
>> targetAssembly.MainModule.ImportReference(typeForwardToDefinition);
>>
>>                     MethodReference ctor = targetAssembly.MainModule.Impo
>> rtReference(typeof(TypeForwardedToAttribute).GetConstructor(new Type[] {
>> typeof(System.Type) }));
>>                     CustomAttribute forwardAttribute = new
>> CustomAttribute(ctor);
>>
>>                      forwardAttribute.ConstructorArguments.Add(new
>> CustomAttributeArgument(
>>                          targetAssembly.MainModule.Imp
>> ortReference(typeof(System.Type)),
>>                          Type.GetType(typeForwardToReference.FullName)));
>>
>>
>>                       targetAssembly.CustomAttribute
>> s.Add(forwardAttribute);
>>                       etc..
>>
>>
>> this doesn´t produce the desired effect at System.Web.Mvc.dll metadata,
>>
>> In addition, what is the correct way to proceed with ExportedTypes ?
>>
>>
>> Thanks a lot !
>> David
>>
>>
>>
>> El martes, 30 de enero de 2018, 12:40:01 (UTC+1), Molowe escribió:
>>>
>>>
>>> Mayor source of PEVerify errors seems owing to TypeForwardedTo
>>> attribute.
>>>
>>> After strong.name deletion all  externs forwarded to
>>> "System.Web.WebPages" are transformed into forwards to "System" (that is
>>> what ILdasm show us)
>>>
>>>
>>> From
>>>
>>> .class extern forwarder System.Web.Mvc.TagBuilder
>>> {
>>>   .assembly extern System.Web.WebPages
>>> }
>>>
>>> to
>>>
>>> .class extern forwarder System.Web.Mvc.TagBuilder
>>> {
>>>   .assembly extern System
>>> }
>>>
>>>
>>> So far I don´t see this assembly attribute living at
>>> AssemblyDefinition.CustomAttributes.
>>>
>>> Following syntax doesn´t work
>>>
>>> var attributes = targetAssembly.CustomAttributes.Where(attr
>>> =>attr.AttributeType.FullName == typeof(TypeForwardedToAttribut
>>> e).FullName
>>>
>>> Is there any default cecil syntax for accessing and editing this info?,
>>>
>>> In this line...., It will be enough using 
>>> assemblyDef.Main.Module.ImportReference(type)
>>> ?
>>>
>>>
>>> Many thanks !
>>> David
>>>
>>>
>>> El martes, 30 de enero de 2018, 10:17:12 (UTC+1), Molowe escribió:
>>>>
>>>> Hi Jb,
>>>>
>>>> So far this is the error we are getting:
>>>>
>>>> Unable to load type 'System.Web.WebPages.PreApplicationStartCode' of
>>>> assembly  'System, Version=4.0.0.0, Culture=neutral,
>>>> PublicKeyToken=b77a5c561934e089'.
>>>>
>>>> Info PEVerify over System.Web.Mvc.dll also goes in the same direction,
>>>> it´s seems issue comes from custom attributes for PreApplicationStartMethod
>>>> and TpeForwardedTo
>>>>
>>>>
>>>> In addition, anytime we need to update a reference assembly for fixing
>>>> custom attributes a new strong-name deletion has to be done for saving it,
>>>> so the initial process starts again for referenced assembly (transitivity
>>>> you metioned)
>>>>
>>>>
>>>>
>>>> Thanks
>>>> David
>>>>
>>>>
>>>> El jueves, 25 de enero de 2018, 22:54:16 (UTC+1), Jb Evain escribió:
>>>>>
>>>>> Removing strong name is usually hard as you have to clean references
>>>>> of the transitive closure of all assemblies that your program uses.
>>>>>
>>>>> What error are you getting? That will usually tell you where to start
>>>>> looking.
>>>>>
>>>>> Jb
>>>>>
>>>>> On Fri, Jan 19, 2018 at 7:43 AM, Molowe <david.c...@gmail.com> wrote:
>>>>>
>>>>>> Hi
>>>>>>
>>>>>> I have built an Injector framework basis on Cecil. So far, I have no
>>>>>> issues for injecting aspects to custom.Net Assemblies (client code), so 
>>>>>> one
>>>>>> of my goals is to take step further and try to inject some logic inside
>>>>>> native .NET Assemblies (in this case I´m instrumenting 
>>>>>> System.Web.Mvc.dll).
>>>>>> I´m able to inject required aspects inside it, and delete System.Web.Mvc
>>>>>> strong name and related attributes (creating a new copy) , and update
>>>>>> SampleWeb.dll (MVC web proyect which references System.web.Mvc.dll)
>>>>>> reference for consuming the clean copy of System.Web.Mvc.dll without 
>>>>>> strong
>>>>>> name.
>>>>>>
>>>>>> In addition I´ve refreshed all SampleWeb.dll references (by directly
>>>>>> importing types inside each one), and also I have updated System.Web.Mvc
>>>>>> references (over new copy). In addition I have updated 
>>>>>> "InternalsVisibleTo"
>>>>>> attributes in those assemblies for which System.Web.Mvc.dll depends on
>>>>>> (when needed)
>>>>>>
>>>>>> So far, I continue exploring posibilities but I´m not able to run
>>>>>> SampleWeb
>>>>>>
>>>>>> question here : It should be enough using this approach for achieving
>>>>>> this goal?  or I´m missing something
>>>>>>
>>>>>> thanks in advance !
>>>>>>
>>>>>> --
>>>>>> --
>>>>>> --
>>>>>> 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 mono-cecil+...@googlegroups.com.
>>>>>> 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 mono-cecil+unsubscr...@googlegroups.com.
> 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 mono-cecil+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to