C# 已签名的程序集生成一个";“应用程序已停止工作”;关于SOAP反序列化

C# 已签名的程序集生成一个";“应用程序已停止工作”;关于SOAP反序列化,c#,serialization,soap,crash,assemblies,C#,Serialization,Soap,Crash,Assemblies,我正在实例化一个对象,并使用SOAP数据填充它 这过去很管用 但是,在给程序集起了一个强名称之后,我得到了以下错误: 重要的是: 应用程序已停止工作 问题签名:System.Runtime.Serialization.Formatters.Soap 调试器向我显示一个System.Runtime.Serialization.SerializationException,其中包含以下详细信息。请注意序列化解析器如何抱怨“没有与Xml键关联的程序集” 完整的错误描述如下: 分析错误,没有与Xml

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

这过去很管用

但是,在给程序集起了一个强名称之后,我得到了以下错误:

重要的是:

应用程序已停止工作

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

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

完整的错误描述如下:

分析错误,没有与Xml键a1:MainForm关联的程序集

这是StackTrace

在System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessGetType(字符串值、字符串xmlKey、字符串和汇编字符串)

在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处理程序,ISerParser-serParser)

在System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(流序列化流,HeaderHandler处理程序)

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

在C:\MyProject\Program.cs中的MyProject.Program.Main()处:第35行

位于System.AppDomain.\u nExecuteAssembly(RuntimeAssembly程序集,字符串[]args)

位于System.AppDomain.ExecuteAssembly(字符串汇编文件、证据汇编安全性、字符串[]args)

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

位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态)

在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔ignoreSyncCtx)

在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)

位于System.Threading.ThreadHelper.ThreadStart()处

我取消了“对程序集签名”的检查,重建了解决方案,像魔术一样,一切都恢复了正常——因此,我知道坏的SOAP文件不是根本原因。事实上,如果我不得不大胆猜测的话,我会说强程序集名称“混淆”了SOAP反序列化程序

如何解决此问题?

消息

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

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

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

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


因此,这可能是一个部署问题(确保序列化和反序列化程序集具有相同的全名),或者如果您确实需要能够处理具有不同全名的程序集(但这并不常见),则可以使用自定义绑定器,就像这里所做的:虽然我不推荐它用于标准操作。

屏幕截图中的错误是什么?以“Parse error…”开头@sll给出调用反序列化方法的入口点的完整路径。我已经编辑了这篇文章以包含这些信息。谢谢你提供的详细信息。我几天前就得出了这个结论,但我想在这个问题上看到更多。你的回答给了我额外的信息和对我的解决方案的信心。