感觉就像这可能是一个简单的答案,但我一直无法找到它.
有问题的场景是C#.NET控制台应用程序.
我通常使用DebugDiag 1.2来检查来自我们经历的挂起的.dmp文件 - 通常是线程锁定问题.它们是使用DebugDiag的"Create Full Userdump"选项创建的.
我最近开始编译面向.NET 4的应用程序,准备开始使用.NET 4的一些功能.但是,我注意到在使用DebugDiag分析这些.dmp文件时,缺少所有.NET堆栈信息.
如果我将CLR目标更改回.NET 3.5,并从新的可执行文件中捕获.dmp,那么.NET调用堆栈信息就在那里.
当我查看DebugDiag的输出时,我看到一条说明:
CLR信息
CLR版本= 4.0.30319.17929 CLR调试器扩展= C:\ Program Files\DebugDiag\Exts\psscor4.dll
.NET线程摘要
无法请求ThreadStore
我认为"无法请求ThreadStore"是问题的关键,因为.NET 3.5 .DMP文件(使用psscor2.dll)报告"Threads Summary"标题下的所有线程信息.
是.dmp缺少信息的问题,还是DebugDiag由于某种原因无法检索它?
在我们的应用程序中,我们有一个Money类型,其中包含一个金额(十进制)和一个货币代码(字符串)。简单来说,它看起来像这样:
public class Money
{
public decimal Amount{get;set;}
public string CurrencyCode{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
就像您想象的那样,它在应用程序的许多地方都得到了使用,并且在发送到客户端或从客户端发送时经常被序列化/反序列化。货币金额通常序列化为复合值,例如“ 1.23USD”代表$ 1.23。旧客户端(HTML / JS)会将其值解析为其组成部分,再转换为Money类型。Money值作为元素值和属性值发送,具体取决于它们在应用程序中的位置,例如:
<SomeClass moneyValue="1.23USD" ... />
Run Code Online (Sandbox Code Playgroud)
要么
<SomeClass>
<MoneyValue>1.23USD</MoneyValue>
...
</SomeClass>
Run Code Online (Sandbox Code Playgroud)
我试图找出一种方法,可以使用内置的C#/。NET Xml序列化工具来具有相同的行为。我研究了实现ISerializable的方法,但是还没有找到完全正确的方法。
本质上,我希望能够通过自己的自定义逻辑对货币金额进行反序列化(知道如何将“ 1.23USD”解析为货币金额),并将其序列化为简单的字符串,例如“ 1.23USD”
最终目标将是使某个类中的货币金额如下:
[XmlAttribute]
public Money SomeField // SomeField='123.USD
Run Code Online (Sandbox Code Playgroud)
要么:
[XmlElement]
public Money SomeOtherField //<SomeOtherField>1.23USD</SomeOtherField>
Run Code Online (Sandbox Code Playgroud)
就像您可以使用简单类型(例如int,string,double等)一样进行操作。
这可能吗?