【发布时间】:2011-10-14 04:45:38
【问题描述】:
我有一个用 C# 4 编写的自动化插件(实现 Extensibility.IDTExtensibility2),我试图在其中加载一些(二进制)序列化数据。它在单元测试中完美运行,但在 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;
我认为会根据here 忽略该版本。
后来想可能是Excel的“受信任位置”的概念,所以我添加了项目的目录并检查了所有子目录,但错误仍然存在。
我尝试添加 System.Runtime.Serialization.OptionalFieldAttribute 属性是徒劳的,但没有帮助。
单元测试可以加载自己生成的序列化文件或Excel中执行的相同代码,但Excel无论是否进行实际序列化,都无法加载序列化数据。
Excel 无法反序列化它自己序列化的内容这一事实暗示这是一个重头戏,因为它显然可以访问所使用的程序集。
所以问题是为什么 Excel 反序列化与我的单元测试不同? (或者更重要的是;我怎样才能在 Excel 中进行反序列化?)
谢谢。
【问题讨论】:
-
更新:删除 AssemblyFormat 设置并不能解决问题。这存在的唯一原因是为了帮助单元测试(我只是加载以前的序列化数据)
-
我很确定这是由于 [ClassInterface(ClassInterfaceType.AutoDual)] 产生警告“...使用 ClassInterface(ClassInterfaceType.AutoDual) 可能版本不正确...”代码:CA1408。所以现在我需要找到一种方法来删除这个 ClassInterface,它仍然允许自动化插件注册 UDF 并实现 IDTExtensibility2 来处理 Excel.Application
标签: c# excel serialization deserialization