yuanrui / blog

Some notes.
http://yuanrui.github.io
3 stars 0 forks source link

.Net开发补遗 #9

Open yuanrui opened 7 years ago

yuanrui commented 7 years ago

Trace.WriteLine使用问题

今天同事给我说Trace.WriteLine没有没有起作用,相关信息没有显示到Winform中。第一反应是感觉是不可能,多半是调用或者自定义的TraceListener有问题。 检查了下代码,断点调试确实没有进入重写的WriteLine方法中。觉得很奇怪,项目中Console和Winfrom项目都没有出现这个问题啊。 后面发现是项目属性的生成选项卡里面的设置有问题。生成选项卡中常规栏 定义TRACE常量未勾选上。 用反编译软件ILSpy,查看生成的程序集。当未勾选定义TRACE常量时,调用了Trace类的静态方法都未编译进入程序集中。将定义DEBUG产量的选项设置为未勾选时,调用了Debug相关的静态方法未编译进入程序集。 而以前一直记得,Release模式不会打包Debug静态方法,看来有误。主要的控制选项还是在于是否勾选定义DEBUG和TRACE常量。 其实Debug和Trace的静态方法上打有ConditionalAttribute,这个Attribute包含一个ConditionString,用于指定条件编译符号。Debug的静态方法设置的Attribute是[Conditional("DEBUG")],Trace的静态的静态方法设置的Attribute是[Conditional("TRACE")]. DEBUG和TRACE对应选项卡中默认常量。 Debug模式配置 build-debug Release模式配置 build-release

图片文件被占用的问题

项目中有一个同步程序负责往某个文件夹中同步图片,另外一个播放图片的程序负责从文件夹中读取图片文件并播放。 遇到一个奇怪的问题是,同步的时候老是报文件被另外一个进程占用。排查发现图片播放程序调用Image.FromFile方法的时候会导致图片文件一直被占用。 解决的办法是将文件转换为字节数组,加载到内存中再转换为Image对象。

public static Image GetImageFromPath(string path)
{
    var bytes = File.ReadAllBytes(path);
    var ms = new MemoryStream(bytes);
    var img = Image.FromStream(ms);
    return img;
}

字典的序列化问题

字典的序列化/反序列化不支持类型“System.Collections.Generic.Dictionary`2[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”,键必须为字符串或对象。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentException: 字典的序列化/反序列化不支持类型“System.Collections.Generic.Dictionary`2[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”,键必须为字符串或对象。

堆栈跟踪:

[ArgumentException: 字典的序列化/反序列化不支持类型“System.Collections.Generic.Dictionary`2[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”,键必须为字符串或对象。]
   System.Web.Script.Serialization.JavaScriptSerializer.SerializeDictionary(IDictionary o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +619

--

在asp.net mvc 4中内部使用的JavaScriptSerializer作为序列化器,不能序列化Key为值类型的字典。替代方案是使用Json.Net或将Key值类型修改为String.