У меня есть надстройка автоматизации (реализующая Extensibility.IDTExtensibility2), написанная на C # 4, в которой я пытаюсь загрузить некоторые (двоичные) сериализованные данные. Он отлично работает в модульных тестах, но не работает при запуске из Excel:
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
На BinaryFormatter я устанавливаю AssemblyFormat (для сериализации и десериализации) следующим образом:
serializationCodec.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
То, что я думал, будет игнорировать версию согласно здесь .
Затем подумал, что это может быть связано с тем, что в Excel указано «Надежное расположение», поэтому я добавил каталог проекта и проверил все подкаталоги, но ошибка осталась.
Напрасно я пытался добавить атрибут System.Runtime.Serialization.OptionalFieldAttribute, но это не помогло.
Модульные тесты могут загружать сериализованные файлы, сгенерированные самим собой, или тот же код, выполненный в Excel, но Excel не может загрузить сериализованные данные независимо от того, была ли выполнена фактическая сериализация.
Тот факт, что Excel не может десериализовать то, что он сериализовал сам, намекает на то, что это редерринг, поскольку он, очевидно, будет иметь доступ к используемой сборке.
Итак, вопрос в том, почему Excel десериализуется иначе, чем мой модульный тест? (Или, может быть, более важно; как я могу заставить десериализацию работать в Excel?)
спасибо.