1

我的项目中有一些配置文件,可以在运行时使用带有列表框和属性网格的用户控件进行更改。使用这种方法,每次手动将配置文件更改到项目文件夹中时,我都必须从 \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?

4

1 回答 1

0

尝试预生成 XML 序列化程序集:http: //msdn.microsoft.com/en-us/library/bk3w6240%28v=VS.100%29.aspx

于 2012-05-16T19:49:27.947 回答