我的项目中有一些配置文件,可以在运行时使用带有列表框和属性网格的用户控件进行更改。使用这种方法,每次手动将配置文件更改到项目文件夹中时,我都必须从 \bin\debug\ 文件夹中复制配置文件。
现在我想在设计时更改这些文件的内容。所以我开始写我自己的设计师。第一次打开设计器时,一切正常,但是当项目重建时,它不再工作了。当反序列化对象被强制转换时会发生 InvalidCastException,这似乎是http://social.msdn.microsoft.com/Forums/pl-PL/csharpgeneral/thread/7192f23e-7d43-47b5-b401-5fcd19671cf6中描述的问题类型相同,但它们不在同一个程序集中。
这是将 UserControl1 添加到窗体时出现相同问题的示例:
public class SerializerTest
{
public String Name { get; set; }
}
[Designer(typeof(MyDesigner))]
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public String Content
{
get { return this.textBox1.Text; }
set { textBox1.Text = value; }
}
}
class MyDesigner : ControlDesigner
{
public override void Initialize(IComponent component)
{
base.Initialize(component);
try
{
string fName = @"D:\XMLSerializerTest\WindowsFormsApplication1\WindowsFormsApplication1\test.xml";
XmlSerializer xmlSer = new XmlSerializer(typeof(SerializerTest));
FileStream fs = new FileStream(fName, FileMode.Open);
SerializerTest test = (SerializerTest)xmlSer.Deserialize(fs);
((UserControl1)this.Control).Content = (test != null) ? test.ToString() + " \n" + test.Name : "NULL";
}
catch (Exception ex) { ((UserControl1)this.Control).Content = ex.Message; }
}
}
似乎序列化程序在重建后仍然被缓存和使用。所以我已经尝试了一个更复杂的构造函数,不应该使用缓存,但行为没有改变。
有谁知道如何避免invalidcastexception?