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