2013-09-06 1 views
2

Je rencontre des problèmes lors de la fusion d'un assemblage contenant mes aspects PostSharp dans mon projet via SmartAssembly et je me demandais si quelqu'un pouvait vous aider.Comment fusionner un assemblage contenant des aspects PostSharp dans Smart Assembly

L'assemblage principal est assez simple et ressemble à: -

class Program 
{ 
    static void Main(string[] args) 
    { 
     var doer = new Doer();     

     doer.Do(); 

     Console.WriteLine("press any key to continue"); 
     Console.ReadKey();   
    } 
} 

[MethodDebugLogging(AttributeTargetElements = MulticastTargets.Method)] 
public class Doer 
{ 
    public void Do() 
    { 
     Console.WriteLine("stuff and nonesense"); 
    } 
} 

L'aspect MethodDebugLogging fonctionne très bien pourvu qu'il soit dans le même ensemble, mais en ajoutant à son propre assemblage puis la fusion via les résultats smartassembly dans: -

System.TypeInitializationException: The type initializer for '<>z__Aspects' thre 
w an exception. ---> System.TypeInitializationException: The type initializer fo 
r '<>z__AspectsImplementationDetails762586886' threw an exception. ---> System.I 
O.FileNotFoundException: Could not load file or assembly 'Aspects, Version=1.0.0 
.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system 
cannot find the file specified. 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String cod 
eBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& 
stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppre 
ssSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName as 
semblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntr 
ospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evid 
ence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 
    at System.Reflection.Assembly.Load(String assemblyString) 
    at PostSharp.Aspects.Serialization.BinaryAspectSerializationBinder.BindToType 
(String assemblyName, String typeName) 
    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Bind(String as 
semblyString, String typeString) 
    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(Binary 
AssemblyInfo assemblyInfo, String name) 
    at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String obje 
ctName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInf 
ormationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, Bi 
naryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) 
    at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWi 
thMapTyped(BinaryObjectWithMapTyped record) 
    at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 
    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(He 
aderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAp 
pDomain, IMethodCallMessage methodCallMessage) 
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize 
(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCr 
ossAppDomain, IMethodCallMessage methodCallMessage) 
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize 
(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallM 
essage methodCallMessage) 
    at PostSharp.Aspects.Serialization.BinaryAspectSerializer.Deserialize(Stream 
stream, IMetadataDispenser metadataDispenser) 
    at PostSharp.Aspects.Serialization.AspectSerializer.Deserialize(Assembly asse 
mbly, String resourceName, IMetadataDispenser metadataDispenser) 
    at <>z__AspectsImplementationDetails762586886..cctor() 
    --- End of inner exception stack trace --- 
    at Obfuscation_Spike1.Doer.<>z__Aspects..cctor() 
    --- End of inner exception stack trace --- 
    at Obfuscation_Spike1.Doer.Do() 
    at Obfuscation_Spike1.Program.Main(String[]) 

Et l'aspect lui-même est assez simple: -

[Serializable] 
public class MethodDebugLogging : 
    OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Console.WriteLine("Entering: {0}.{1}", args.Method.DeclaringType, args.Method.Name); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Console.WriteLine("Exiting: {0}.{1}", args.Method.DeclaringType, args.Method.Name); 
    } 
} 

De l'exception, il me semble que si l'espace de noms des aspects de la distribution Postsharp est supprimé lorsque je fusionne l'assemblage contenant l'aspect, est-ce que quelqu'un peut faire la lumière sur cela?

Merci

Paul

Répondre

1

La meilleure façon de rendre votre assemblage facilement fusionnables est d'utiliser [PSerializable] au lieu de [Serializable].

Si vous souhaitez continuer à utiliser [Serializable], vous devrez configurer la liaison d'assembly lors de l'exécution. Voir http://doc.postsharp.net/postsharp-3.0/##PostSharp-3.0.chm/html/fbd7975f-6c20-41d8-bda5-38392ed2ad00.htm pour plus de détails.

+0

Merci Gael. Malheureusement, nous utilisons encore PostSharp 2.1 donc pas PSerializable pour nous. devra se pencher sur la liaison d'assemblage à l'exécution, je suppose. –

+0

Nice. Ajouté ((BinaryAspectSerializationBinder) BinaryAspectSerializer.Binder) .Retarget ("Aspects", "Obfuscation_Spike1"); au sommet de la principale et cela a fonctionné comme un charme. Merci Gaël. Marquer comme réponse, mais la limitation des points m'empêche de voter. –

Questions connexes