最近、非常に大きなプロジェクトを.NET Framework 3.5から4にアップグレードしましたが、当初はすべてが同じように動作していました。しかし、現在、コピー貼り付け操作でバグが表示され始めています。 私は小さな再現可能なアプリケーションを作成しました。これは.NET 3.5と4で異なる動作を示しています。 回避策を見つけました(手動でデータをクリップボードにシリアル化します)。しかし、 「なぜ」、行動に違いがあります。.NET 3.5と4ではクリップボードの動作が異なりますが、なぜですか?
これは私が作った小さなテストアプリです:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
namespace ClipboardTest
{
public class Program
{
[Serializable]
public class Element
{
public Element(string name)
{
this.name = name;
}
public string name;
}
public static List<Element> TestSerializer(List<Element> obj)
{
var memoryStream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, obj);
return (List<Element>)formatter.Deserialize(new MemoryStream(memoryStream.GetBuffer()));
}
public static List<Element> TestClipboard(List<Element> obj)
{
Clipboard.SetDataObject(obj);
return (List<Element>)Clipboard.GetDataObject().GetData(typeof(List<Element>));
}
public static void DumpObject(string testName, List<Element> obj)
{
if (obj == null)
{
Console.WriteLine("{0} : List is null", testName);
return;
}
foreach (var prop in obj)
{
Console.WriteLine("{0} : {1}", testName, prop.name);
}
}
[STAThread]
static void Main()
{
var copyData = new List<Element> { new Element("all good") };
DumpObject("Serializer", TestSerializer(copyData));
DumpObject("Clipboard", TestClipboard(copyData));
}
}
}
.NET 3.5出力:
シリアライザ:すべての良い
クリップボード:すべての良い
.NET 4出力:
シリアライザ:すべてgood
クリップボード:リストはnullです
クリップボード& DataObjectクラスの.NETソースを調べましたが、どのシリアライザが使用されているのかわかりませんでした。 MSDNのドキュメントでは、型がシリアライズ可能でなければならないとしています。この場合、List <>とElementクラスの両方があります。 Elementオブジェクトのコピーはうまくいきますが、要素のリストをコピーするとすぐに破棄されます。
私はVisual Studio 2010 SP1で2つのC# "コンソールアプリケーション"プロジェクトを作成しました。最初のプロジェクトでは、既定の "ターゲットフレームワーク"の設定である ".NET Framework 4 Client Profile"の設定が残っています。 2番目のプロジェクト「.NET Framework 3.5 Client Profile」を使用するように変更しました。
私のフォームDLLのバージョンに関する追加情報:
オリジナルファイル名:のSystem.Windows.Forms.dll
ファイルのバージョン/ Prouctバージョン:4.0.30319.235
言語:英語(米国)
変更日:16に-02-2012 22:50
.NET 4ではうまく動作します...どちらの場合も "all good"と表示されます –
私のマシンでは3.5でうまく動作し、4.0と同じようにターゲットフレームワークとして失敗します状態(Clipboard.GetDataObject()。GetData()に "無効なFORMATETC構造体" COM例外がスローされます)。また、私は似たような問題を発見しました:https://connect.microsoft.com/VisualStudio/feedback/details/488627/comexception-invalid-formatetc-structure-while-pasting-marshalbyref-data-from-datagridview – Alan
(VS2010 SP1 on XP SP3) – Alan