プロジェクトには、リストボックスとプロパティグリッドを備えたユーザーコントロールを使用して実行時に変更できる構成ファイルがいくつかあります。このアプローチでは、手動でプロジェクト フォルダーに変更するたびに、構成ファイルを \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; }
}
}
シリアライザーは再構築後もキャッシュされて使用されているようです。そのため、キャッシュを使用しないより複雑なコンストラクターを既に試しましたが、動作は変わりません。
無効なキャスト例外を回避する方法を知っている人はいますか?