2015-04-23 8 views
6

У меня есть некоторый кодКак загрузить DLL файлы во время отладки в VS2013

var aa = a(); 
b(aa); 

Во время отладки, я поставил точку останова на b() вызова. Затем, перейдя в ближайшее окно , я хотел бы иметь возможность выполнять код из DLL, который находится в моем проекте , но еще не загружен. Скажем, я хочу новый Boo и позвоните Foo(). Код находится в пространстве имен Baz в dll Spongle.dll.

Когда я тип

>> new Baz.Boo().Foo(aa) 

Я получаю ошибку: типа или пространства имен имя «Баз» не действует в этой области.

Если я изменю свой код таким образом, что мой Boo уже загружен, он отлично работает.

new Boo(); // dummy to ensure loading 
var aa = a(); 
b(aa); 

Можно ли загрузить DLL из непосредственного окна во время отладки, так что я могу назвать свой код, несмотря на то загружается (пока) ?. Я мог бы использовать new Boo() как статический инициализатор основного класса моего приложения, но тогда у меня возникают проблемы во время модульного тестирования, поскольку он не обязательно должен включать класс с этим статическим инициализатором.

+0

Пространство имен 'Baz' и уже включено в мой вопрос, к сожалению. –

+0

Должно быть, вы что-то упустили, поскольку у меня никогда не было проблемы, которую вы описываете. Можете ли вы показать полное определение вашего класса Boo? –

+0

@Nathan A: Возьмите любую DLL, которую вы используете в своем приложении, отлаживаете единичный тест, не используя эту DLL, устанавливаете точку останова и пытаетесь создать экземпляр из этой DLL в непосредственном окне –

ответ

2

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

Следующая не будет работать:

var obj = new Newtonsoft.Json.Linq.JObject(); 

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

var assembly = System.Reflection.Assembly.LoadFile("C:\\AbsolutePath\\bin\\Debug\\Newtonsoft.Json.dll"); 
var obj = new Newtonsoft.Json.Linq.JObject(); 

Причина этой необходимость из Immediate Window является то, что ваше приложение (или модульное тестирование boostrapped применения в данном случае) нагрузки, он ищет ссылки по всему коду и загружает необходимые узлы для удовлетворения ваших потребностей. В вашем случае у вас нет явной ссылки на сборку в вашем коде, поэтому она не загружается. Непосредственное окно не имеет контекста и, следовательно, вы должны явно загрузить его.

Чтобы запрограммировать ссылки на потенциальные сборки для загрузки, вы можете использовать каталог bin загруженной сборки. Это позволяет вывести абсолютный путь во время выполнения.

var filePath = new Uri(this.GetType().Assembly.CodeBase).LocalPath; 
var bin = System.IO.Path.GetDirectoryName(filePath); 
var assembly = System.Reflection.Assembly.LoadFile(bin + "\\Newtonsoft.Json.dll"); 
+0

Есть ли переменная в VS, указывающая на путь сборки или nuget, где находятся пакеты nuget? так что можно сказать 'System.Reflection.Assembly.LoadFile ($ nugetpath + "Newtonsoft.Json.dll") '? –

+1

@ CarloV.Dango Обновлен мой ответ. Вам не обязательно будет ссылаться на источник пакета nuget (особенно учитывая, что ожидается, что существующая структура изменится в vNext). Тем не менее вы можете вытащить сборки из каталога bin в точке входа приложения. –

 Смежные вопросы

  • Нет связанных вопросов^_^