Буфер обмена ведет себя по-разному в .NET 3.5 и 4, но почему?

Недавно мы обновили очень большой проект с .NET framework 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:
Сериализатор: все в порядке
Буфер обмена: List is null

Я просмотрел исходный код .NET для класса Clipboard & DataObject, но не смог увидеть, какой сериализатор был использован. В документации MSDN говорится, что тип должен быть сериализуемым, что в данном случае имеет классы List <> и Element. Копирование объекта Element работает нормально, но как только я копирую список элементов, он ломается.

Для тестирования я создал 2 проекта C # «Консольное приложение» в Visual Studio 2010 SP1. Первый оставленный мной проект с настройкой по умолчанию «Целевая платформа» - «Клиентский профиль .NET Framework 4». Второй проект, который я модифицировал, чтобы использовать «Клиентский профиль .NET Framework 3.5».

Дополнительная информация о моей версии DLL Forms:
Исходное имя файла: System.Windows.Forms.dll
Версия файла / Версия продукта: 4.0.30319.235
Язык: английский (США)
Дата изменения: 16-02-2012 22:50

25
задан remio 27 February 2012 в 08:50
поделиться