2015-04-23 15 views
6

Tôi có một số mãLàm thế nào để nạp của dll trong debug trong VS2013

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

Trong khi gỡ lỗi, tôi đặt một breakpoint trên b() gọi. Sau đó, đi đến cửa sổ ngay lập tức , tôi muốn có thể thực thi mã từ một DLL nằm trong dự án của tôi nhưng chưa được tải. Nói rằng tôi muốn có một số Boo mới và gọi Foo(). Mã nằm trong không gian tên Baz trong dll Spongle.dll.

Khi tôi gõ

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

tôi nhận được lỗi: Loại hoặc namespace tên 'Baz' không hợp lệ trong phạm vi này.

Nếu tôi thay đổi mã của mình sao cho số Boo của tôi đã được tải thì hoạt động tốt.

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

Có thể tải dll từ cửa sổ ngay lập tức trong khi gỡ lỗi để tôi có thể gọi mã của tôi cho dù nó được tải (chưa) ?. Tôi có thể sử dụng new Boo() làm khởi tạo tĩnh của lớp chính của ứng dụng, nhưng sau đó tôi gặp vấn đề trong khi kiểm thử đơn vị vì nó sẽ không liên quan đến lớp với bộ khởi tạo tĩnh đó.

+0

Không gian tên là 'Baz' và không được bao gồm trong câu hỏi của tôi. –

+0

Phải có một cái gì đó bạn đã bỏ qua, như tôi đã không bao giờ có vấn đề bạn đang mô tả. Bạn có thể hiển thị định nghĩa đầy đủ về lớp Boo của mình không? –

+0

@Nathan A: Dùng bất kỳ DLL nào bạn sử dụng trong ứng dụng của bạn, gỡ lỗi một bài kiểm tra đơn vị không sử dụng dll đó, đặt điểm ngắt và thử instantiating từ dll đó trong cửa sổ ngay lập tức –

Trả lời

2

Mặc dù nặng, tất nhiên bạn có thể sử dụng phản chiếu để tải lắp ráp cho thử nghiệm đó.

sau sẽ không làm việc:

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

kể từ khi lắp ráp chưa có mặt. Tuy nhiên, nếu tôi tải nó lần đầu tiên thông qua sự phản chiếu và đường dẫn tuyệt đối vào thùng rác của tôi, tôi có thể khởi tạo đối tượng tốt.

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

Lý do cho sự cần thiết này từ cửa sổ trước mắt là khi ứng dụng của bạn (hoặc kiểm tra đơn vị boostrapped ứng dụng trong trường hợp này) tải, nó sẽ tìm kiếm tài liệu tham khảo trong suốt mã và nạp các assembly cần thiết để đáp ứng nhu cầu của bạn. Trong trường hợp của bạn, bạn không có một tham chiếu rõ ràng để lắp ráp trong mã của bạn, do đó, nó không được nạp. Cửa sổ ngay lập tức không có ngữ cảnh và, như vậy, bạn phải tải nó một cách rõ ràng.

Để tham khảo có lập trình các hội đồng tiềm năng để tải, bạn có thể sử dụng thư mục bin của hội đồng được tải. Điều này cho phép bạn kéo đường dẫn tuyệt đối trong thời gian chạy.

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

Có một biến trong VS trỏ đến đường dẫn xây dựng hoặc nuget nơi gói nuget cư trú? sao cho người ta có thể nói 'System.Reflection.Assembly.LoadFile ($ nugetpath + "Newtonsoft.Json.dll") '? –

+1

@ CarloV.Dango Đã cập nhật câu trả lời của tôi. Bạn sẽ không nhất thiết muốn tham khảo nguồn gói nuget (đặc biệt là xem xét cấu trúc hiện tại được dự kiến ​​sẽ thay đổi trong vNext). Điều đó nói rằng, bạn có thể kéo các hội đồng từ thư mục bin của điểm vào của ứng dụng. –

Các vấn đề liên quan