J'ai un addin automation (implémentant Extensibility.IDTExtensibility2), écrit en C# 4, dans lequel j'essaye de charger des données sérialisées (binaires). Il fonctionne parfaitement dans les tests unitaires, mais échoue lors de l'exécution à partir d'Excel:La désérialisation C# échoue dans Automation Addin mais pas dans les tests NUnit
Unable to find assembly 'XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
at
Sur BinaryFormatter je réglage de la AssemblyFormat (pour les deux sérialisation et désérialisation) comme suit:
serializationCodec.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
Ce que je pensé ignorerait la version selon here. Ensuite, je pensais que cela pouvait être dû à la notion de "Trusted Location" d'Excel, j'ai donc ajouté le répertoire du projet et vérifié tous les sous-répertoires, mais l'erreur est restée.
En vain, j'ai essayé d'ajouter l'attribut System.Runtime.Serialization.OptionalFieldAttribute, mais cela n'a pas aidé. Les tests unitaires peuvent charger les fichiers sérialisés générés par lui-même ou le même code exécuté dans Excel, mais Excel ne peut pas charger les données sérialisées, qu'il ait ou non effectué la sérialisation réelle. Le fait qu'Excel ne puisse pas désérialiser ce qu'il a lui-même sérialisé indique qu'il s'agit d'un redherring car il aurait évidemment accès à l'assemblage utilisé.
Donc la question est pourquoi Excel désérialiser différemment par rapport à mon test unitaire? (Ou peut-être plus important encore, comment est-ce que je peux obtenir la désérialisation fonctionnant dans Excel?)
merci.
MISE À JOUR: Retrait du paramètre AssemblyFormat ne remédie pas à la situation.La seule raison pour laquelle cela est présent est de faciliter les tests unitaires (je charge juste les données sérialisées précédentes) – earcam
Je suis assez certain que cela est dû au [ClassInterface (ClassInterfaceType.AutoDual)] qui produit un avertissement "... utilise ClassInterface (ClassInterfaceType .AutoDual) qui ne peut pas version correctement ... "code: CA1408. Donc maintenant je dois trouver un moyen de supprimer cette ClassInterface qui permettra à un addin d'automatisation d'enregistrer des UDF et d'implémenter IDTExtensibility2 pour obtenir un handle sur Excel.Application – earcam