我们有一个带有混合C#和VB.NET(3.5)项目的Web解决方案(注意:有几个vb.net文件确实有Option Strict Off)。我们的代码在DotNetNuke 4.8中作为模块运行。在某些情况下,我们的应用程序将崩溃的方法:
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString
该例外中的缩写信息是:
System.ArgumentException: "Error serializing value XYZ of type XYZ."
System.InvalidCastException: "Unable to cast object of type 'System.Int64'
to 'System.String'"
堆栈跟踪中没有任何地方是我们的代码,它只是系统代码,最终无法从我们的代码序列化类型XYZ
。这意味着我无法达到断点并调试XYZ的确切属性是问题。堆栈跟踪属性为空,但在Message中,堆栈跟踪缩写为:
DotNetNuke.Services.Exceptions.PageLoadException: "Error serializing value 'XYZ' of type 'XYZ.'"
System.ArgumentException: "Error serializing value 'XYZ' of type 'XYZ.'"
System.InvalidCastException: "Unable to cast object of type 'System.Int64' to type 'System.String'. "
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject)
// ...... etc.........
at System.Web.UI.Page.SaveAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
// --- End of inner exception stack trace
此跟踪中的所有相关行均以System.
开头。顶线是DotNetNuke。但是,根据第一个答案的建议,我自己编译了DotNetNuke(4.8)代码并且证明代码只是Server.GetLastError
,将InvalidCastException显示为InnerException,而没有关于被序列化的实际值或属性名称的任何其他信息。 / p>
问题是:如何发现序列化程序遇到问题的字段和值?
在研究这个问题时会想到一些相关的问题/问题:
我尝试在ildasm中调查XYZ
和该类中属性的类型,以查看任何异常情况,但找不到任何异常情况。
答案 0 :(得分:2)
你没有提到堆栈跟踪是什么 - 虽然这可能不相关。
如果它在DotNetNuke代码中,我会将DotNetNuke源加载到您的调试器中,并重新创建异常。你也可以编译(相关版本)DotNetNuke源代码,然后将新编译的dll和.pdb文件放到你的\ bin目录中。
完成设置后,进入Visual Studio - >调试,异常,并在“Thrown”列中的“公共语言运行时异常”旁边放置一个复选框。您也可以尝试“本地运行时检查”。
然后重新创建您的测试。代码应该在抛出异常时中断。当发生这种情况时,您不仅可以检查到达该点的堆栈跟踪,还应该能够确定导致问题的值。
请注意,使用这种方法会遇到很多其他异常 - 有些地方使用try / catch作为处理代码的方式,这些都会显示出来。您只需逐步完成这些示例,直到找到所需的示例。
如果所有其他方法都失败了,我会在其中重新编译一个'try / catch'并记录/破坏有问题的值,但你不应该走得那么远。只是让Visual Studio中断抛出的错误应该足以隔离问题。
答案 1 :(得分:0)
回答我自己的问题,希望这可以帮助任何人在搜索查询后到达此处。
最终答案发现于this SO question。我最终使用了.NET Reflector的试用版(以及随附的Visual Studio 2010插件)来进入mscorlib代码。这允许我检查NameInfo以查找导致InvalidCastException的属性。
简而言之,答案是:使用.NET Reflector(或类似工具)进入mscorlib。
PS。虽然步入mscorlib是我在这个问题中提出的问题的答案,但是一旦我获得足够的信息,仍然存在潜在的问题,可能需要一个全新的SO问题。