【问题标题】:Signed assembly generates an "Application has stopped working" on SOAP deserialization签名程序集在 SOAP 反序列化时生成“应用程序已停止工作”
【发布时间】:2011-10-24 20:34:20
【问题描述】:

我正在实例化一个对象,并使用 SOAP 数据填充它。

这曾经运作良好。

但是,在为程序集指定一个强名称后,我收到以下错误:

重要的一点是:

应用程序已停止工作

问题签名:System.Runtime.Serialization.Formatters.Soap

调试器向我显示System.Runtime.Serialization.SerializationException,其中包含以下详细信息。请注意序列化解析器如何抱怨“没有与 Xml 键关联的程序集”

完整的错误描述是:

解析错误,没有与 Xml 键 a1:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3DnullMainForm 关联的程序集

这是堆栈跟踪

在 System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessGetType(String value, String xmlKey, String& assemblyString)

在 System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessType(ParseRecord pr, ParseRecord objectPr)

在 System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessAttributes(ParseRecord pr, ParseRecord objectPr)

在 System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()

在 System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()

在 System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()

在 System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)

在 System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler)

在 System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream 序列化流)

在 C:\MyProject\Program.cs:line 35 中的 MyProject.Program.Main()

在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,String[] args)

在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)

at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

在 System.Threading.ThreadHelper.ThreadStart()

我取消选中“签署程序集”,重新构建解决方案,然后,就像魔术一样,一切恢复正常——所以,我知道错误的 SOAP 文件不是根本原因。事实上,如果我不得不冒险猜测,我会说强程序集名称“混淆”了 SOAP 反序列化器。

我该如何解决这个问题?

【问题讨论】:

  • 截图中的错误是什么?从“解析错误...”开始
  • @sll 给出调用反序列化方法的入口点的完整路径。我已编辑帖子以包含此信息。

标签: c# serialization soap crash assemblies


【解决方案1】:

消息

解析错误,没有与 Xml 键关联的程序集 a1:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull

表示数据已使用将 PublicKeyToken 设置为 null 的程序集进行序列化。这意味着在序列化时,此程序集没有强名称。

现在,如果您重新编译此程序集使用强名称对其进行签名,并在不更改序列化数据的情况下重新部署它,则程序集标识将不会被视为相同,并且反序列化代码将无法使用它进行反序列化,因此错误。

用于序列化和反序列化的程序集必须具有相同的全名(至少使用您使用的格式化程序和绑定器)。

所以它可能是一个部署问题(确保序列化和反序列化程序集具有相同的全名),或者如果您确实需要能够处理具有不同全名的程序集(但这很不寻常),您可以使用自定义活页夹,就像这里所做的一样:Deserializing data into a dynamically loaded Assembly 虽然我不建议将它用于标准操作。

【讨论】:

  • 感谢您提供详细信息。几天前我得出了这个结论,但我想在这个问题上多看一点。您的回答给了我额外的信息和对我的解决方案的信心。
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多