Вызов GetData завершается неудачно в событии DragDrop - PullRequest
0 голосов
/ 09 сентября 2010

Я создаю приложение Winforms с поддержкой перетаскивания в TextBox.TextBox должен позволять помещать на него файлы и текст.Его свойство AllowDrop установлено в true.

Это обработчик события для его события DragDrop:

var validFile = e.Data.GetDataPresent(DataFormats.FileDrop);
var validText = e.Data.GetDataPresent(DataFormats.Text) ||
                e.Data.GetDataPresent(DataFormats.UnicodeText);

if (validFile)
{
    var path = (string)e.Data.GetData(DataFormats.FileDrop);
    this.textBox.Text = File.ReadAllText(path);
}
else if (validText)
{
    var text = (string)e.Data.GetData(typeof(string));
    this.textBox.Text = text;
}

Первый тест: Когда я удаляю файл в этом TextBox, возникает событие DragDropвыполнение выполняется в моем обработчике до этой строки (в этой строке установлена ​​точка останова):

var path = (string)e.Data.GetData(DataFormats.FileDrop);

Если я перешагну через эту инструкцию (F10), выполнение продолжится, но никогда не достигнет следующей инструкции.Приложение снова становится отзывчивым.Это похоже на то, как если бы обработчик был прерван, но исключение не возникло.

Второй тест: Настройте Visual Studio на разрыв всех исключений (установите флажок Бросок перед исключениями CLR в окне Отладка-> Исключения),Выполните те же действия, что и в первом тесте.И все, InvalidCastException вызывается в строке e.Data.GetData (GetData возвращает String [], а не String).

У меня нет какого-либо глобального обработчика исключений в AppDomain илипотоков, и даже если бы сделал, я бы исключение, чтобы быть видимым при ручном переходе через сбой линии.

Я использую Visual Studio 2010. Есть идеи, которые могли бы объяснить это странное поведение?Это важно для меня, потому что, если это не отдельная проблема, это может привести к трудно воспроизводимым ошибкам.

Заранее большое спасибо

РЕДАКТИРОВАТЬ: для меня не имеет смысла то, что обычно необработанное исключение .NET приводит к сбою приложения.Здесь InvalidCastException проистекает из того факта, что Drag & Drop API возвращает массив в метод .NET, и я пытаюсь преобразовать его во время выполнения в строку.В этот момент процесс выполняется исключительно с использованием кода .NET.Почему оно вызывает исключение только при активированном автоматическом разрыве необработанных исключений?

Ответ VdesmedT проливает свет на этот вопрос по-новому, но, похоже, он объясняет, почему Explorer не будет жаловаться, если мое приложение не сможет обработать удаление.событие.

Ответы [ 2 ]

4 голосов
/ 09 сентября 2010

В Windows операция перетаскивания по-прежнему обрабатывается этим старым добрым OLE. OLE Всегда видит источник и цель операции как два разных приложения, даже если оба приложения - одно и то же (ваш случай). OLE всегда проглатывает каждое исключение и не пересылает их ни в одно из двух приложений. Для него не имеет смысла предупреждать исходное приложение о сбое целевого приложения во время удаления. иди фиг; -)

Вы абсолютно должны сами обрабатывать исключения в обработчиках, участвующих в любой операции OLE (т. Е. Перетаскивание)

3 голосов
/ 09 сентября 2010

e.Data.GetData (DataFormats.FileDrop) возвращает массив, попробуйте:

var path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];

Вы должны получить InvalidCastException, или что-то ...

...