2012-04-28 1 views
4

Я могу разместить точки останова и просмотреть переменные для .NET dll, загружаемого с помощью 'Assembly.LoadFile', однако по какой-либо причине визуализатор для Generic List не показать любой из элементов (как видно ниже). То же самое отображается в окне часов, как при наведении курсора на переменную.Отсутствует визуализатор отладки для Generic.List в загруженной сборке времени исполнения

Я исследовал эти различные решения, но никто не похоже на работу (она также кажется, что они в основном иметь дело с даже не будучи в состоянии отладки DLL):

Debug dynamically loaded assembly

Debug dynamically loaded assembly in Visual Studio .NET

Я положил pdb бок о бок с dll (из точного местоположения, из которого он загружен). Я также поместил файл pdb dll прямо рядом с исполняемым файлом, который выполнял загрузку, и до сих пор нет кубиков. Я компилирую в Debug и установил все конфигурации в x86. Одно замечание: если я действительно добавляю dll в качестве ссылки, визуализатор отладки отображается отлично (однако, это плагиновая архитектура, и exe не должен иметь зависимости от dll).

Любые идеи?

[Редактировать]

Оказывается, что я не могу просто добавить плагин как Reference, я на самом деле экземпляр списка этого типа в моем ехе, прежде чем он может отображаться правильно, не зная, что происходит ...

[Редактировать]

Я сделал этот образец проект, который демонстрирует поведение. Я использовал аналогичный код для загрузки плагинов (хотя и достаточно интересно, просто вызываю Assembly.LoadFile напрямую и вызывая метод с помощью отражения, похоже, не вызывает такого поведения. Я закрепил пример проекта здесь: (кто-нибудь еще получает Такие же результаты?)

http://dl.dropbox.com/u/64502227/PluginLoader.zip

[Редактировать]

Другим интересным событием! у меня есть папка Plugins рядом с ехе, где все DLLs идут. в настоящее время я копирование DLL плагин/pdb как в каталоге exe, так и в подкаталоге Plugins. Если я использую Assembly.LoadFile и использую dll в каталоге Plugins, я теряю визуализатор List для своих собственных типы. Если я загружу dll прямо рядом с exe, это работает, но почему?

Что я вижу:

enter image description here

+1

Можете ли вы показать нам код, в котором вы загружаете свои DLL и PDB? – Polity

+1

@Polity Я добавил ссылку на примерный проект, который демонстрирует то же поведение: http://dl.dropbox.com/u/64502227/PluginLoader.zip – Trevor

+0

Еще один прорыв, если я загружу через каталог плагинов, и использую Activator .CreateInstance и передать в Type, он терпит неудачу. Однако, если я вместо этого использую строку: Activator.CreateInstance (assembly.FullName, «SamplePlugin.MyPlugin»). Unwrap() работает. Я думаю, что ключом является «Unwrap», но я не уверен, что это делает для отладчика. Кроме того, я обновил образец PluginLoader (гораздо более сжатый и четко обозначил ошибку). – Trevor

ответ

1

Раствор А:

  • Загрузите все DLLки из каталога ехе и не их собственный каталог.

Раствор Б:

Используйте это, чтобы создать плагин:

Plugin plugin = (Plugin)Activator.CreateInstance(assembly.FullName, "SamplePlugin.MyPlugin").Unwrap(); 

Вместо этого:

Plugin plugin = (Plugin)Activator.CreateInstance(assembly.GetType("SamplePlugin.MyPlugin")); 

Я бы сообразить, что второй линия o f на самом деле просто внутренне вызывается первой строкой кода (например, первая строка должна будет искать сборку по имени, а затем вывести из нее тип «SamplePlugin.MyPlugin», затем Unwrap(), чтобы вернуть ее), но, видимо, нет.

К сожалению, это решение проблемы, но оно не отвечает. ПОЧЕМУ это происходит. Если кто-нибудь знает, я все равно буду признателен за информацию.

0

Вы всегда можете использовать сразу же окно и сделать:

string.Join("\r\n", roots); 

или длинную версию, чтобы включить показатели:

string.Join("\r\n", items.Select((index, item) => 
       string.Format("{0}: {1}", index, item))); 

Или иметь глобальную функцию, которая делает именно это, поэтому ее использование wi буду похорошела, как:

Print(roots); 

И:

public static void Print<T>(IEnumerable<T> items) 
{ 
    Debug.WriteLine(string.Join("\r\n", items.Select((index, item) => 
         string.Format("{0}: {1}", index, item)))); 
} 
+0

Это сработает, но это довольно утомительно для изучения всего дерева таким образом (каждый узел имеет список детей). Я больше ищу ответ, чем работу, но спасибо. – Trevor

+0

Вы можете обернуть его собственным классом только для целей отладки и посмотреть 'new TreeWrapper (items);' – SimpleVar

+1

С каких это пор можно использовать лямбда в непосредственном окне? кроме этого визуализатор отладки должен «просто» работать, на самом деле это не отвечает на вопрос – Polity

0

Проверьте один из вариантов VS: Сервис -> Параметры -> Отладка -> Общие, прокрутите вниз и убедитесь, что «Показать необработанная структура объектов в окне переменных ".

+0

Действительно, он не отмечен, но хорошо знать, что он существует. – Trevor