8

この質問は私が興味を持っているものに近いですが、完全ではありません。

C# で記述された .NET WinForms アプリケーションがあります。ListViewC# オブジェクトの配列を表示するコントロールがあります。これらのリストビュー項目を同じアプリケーション内の別のフォームにドラッグ アンド ドロップできるように接続し、オブジェクトの配列 (type Session) をその別のフォームのドロップ ハンドラに適切に渡します。

ただし、アプリケーションの複数のインスタンスを実行するクロスプロセスのドラッグ/ドロップをサポートしたいと考えています。これは機能するように見えますが (GetDataPresent成功するなど)、実際にデータを取得しようとすると最終的に例外がスローさobject[]Session[]ます。

if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
   Session[] oDroppedSessions;
   try
   {
      oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
   }
   catch (Exception eX)
   {  // reaches here 
   }
}

これを機能させるためにオブジェクトに実装する必要があるかどうかは誰にもわかりませんか? ISerializable普段なら単純にやってみるのですがISerializable、このクラスに実装するのはかなり大変で、変な副作用が出るのではないかと心配です。


UPDATE : 実装ISerializableしても役に立ちません。メソッドが呼び出されることはありません。同様に、Serializable属性をクラスに追加してもまったく影響はありません。他のアイデアはありますか?

4

3 に答える 3

6

プロセス境界を越えています。オブジェクト参照は別のプロセスでは無効です。DataObject クラスは、オブジェクトをシリアライズして壁を越えて取得することをサポートしており、BinaryFormatter を使用します。したがって、[Serializable] 属性をクラスに適用し、オブジェクトが適切にデシリアライズ/シリアライズできることを確認する必要があります。

于 2010-01-21T18:04:58.547 に答える
0

これはショットです。一連のセッション全体を使用するのではなく、次のように個別に実行してみてください...

   Session [] oDroppedSessions;
   試す
   {{
      if(e.Data.GetData( "Fiddler.Session []")!= null){
          object [] objs = e.Data.GetData( "Fiddler.Session []");
          if(objs!= null && objs.Length> 1){
             oDroppedSessions = new Session [objs.Length];
             int nIndex = 0;
             foreach(object obj in objs){
                if(obj is Session){
                  oDroppedSessions [nIndex] =(Session)obj;
                  nIndex ++;
                }
             }
          }
      }
   }
   キャッチ(例外eX)
   {//ここに到達}

セッションの部分がよくわからないので、足で自分を撃つ以外は、一撃の価値があります...

これがお役に立てば幸いです、よろしく、トム。

于 2010-01-21T01:56:52.207 に答える
-1

例外を回避するキャストに「as」を使用できます(キャストが失敗した場合、「as」は例外をスローせずに「null」を返します)-しかし、これで問題が解決するとは思われません(実際の問​​題を回避するだけです)例外)、私が同意するように、クラスをシリアル化可能にする必要がある可能性があります。仮説を機能させるのが難しいフィールドをコメントアウトすることで、仮説をテストできます。今のところ、仮説をテストします。

于 2010-01-21T01:55:24.570 に答える