#開発中に警告が発生
C#でフォーム間をまたぐ変数を使用するプログラムを開発中に、以下の警告メッセージが発生しました。
おや、と思って調べてみるも、いまいちピンとくるものがありません。
CS1690:参照マーシャリング クラスのフィールドであるため、'frm.struct1' のメンバーにアクセスすると、ランタイム例外が発生する可能性があります。
#ソースをみると
Form1.cs
using (Form2 frm = new Form2())
{
frm.ShowDialog();
result = frm.struct1.a;
}
Form2.cs
public struct STRUCT1
{
public int a { get; set; }
public int b { get; set; }
public int c { get; set; }
}
public STRUCT1 struct1;
#あっ、構造体変数がプロパティじゃない
よく見ると構造体内の変数(a, b, c)はプロパティになっていますが、構造体変数(struct1)側がプロパティになっていません。基本的にフォーム間の変数はプロパティでやりとりするため、構造体変数をプロパティにする必要がありそうです。
#修正してみた
Form1.cs
using (Form2 frm = new Form2())
{
frm.ShowDialog();
result = frm.struct1.a;
}
Form2.cs
public struct STRUCT1
{
public int a;
public int b;
public int c;
}
public STRUCT1 struct1 { get; set; }
これで警告は解消されました。めでたしめでたし。