2015-04-23 8 views
6

ich einige Code haben ladenWie DLL während debug in VS2013

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

Während des Debuggens, habe ich einen Haltepunkt auf dem b() Anruf. Dann gehe ich zum sofortigen Fenster, ich möchte in der Lage sein, Code von einer DLL auszuführen, die in meinem Projekt ist, aber noch nicht geladen ist. Sagen wir, ich möchte eine neue Boo und rufen Sie Foo(). Der Code befindet sich im Namespace Baz in dll Spongle.dll.

Als ich

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

geben bekomme ich den Fehler: Der Typ oder Namespace-Name 'Baz' in diesem Bereich nicht gültig ist.

Wenn ich meinen Code so ändern, dass mein Boo bereits geladen ist, funktioniert es gut.

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

Ist es möglich, die DLL aus dem sofortigen Fenster während debug zu laden, so dass ich trotz meiner Code aufrufen kann es (noch) nicht geladen werden ?. Ich könnte das new Boo() als einen statischen Initialisierer meiner Anwendungsklasse verwenden, aber dann habe ich Probleme während des Komponententests, da es die Klasse mit diesem statischen Initialisierer nicht notwendigerweise einschließen wird.

+0

Der Namensraum ist 'Baz' und ist leider schon in meiner Frage enthalten. –

+0

Es muss etwas geben, was du übersehen hast, da ich das Problem, das du beschreibst, nie hatte. Kannst du die komplette Definition deiner Boo-Klasse zeigen? –

+0

@Nathan A: Nehmen Sie jede DLL, die Sie in Ihrer Anwendung verwenden, debuggen Sie einen Komponententest nicht mit dieser DLL, setzen Sie einen Haltepunkt und versuchen Instantiierung von dieser DLL im unmittelbaren Fenster –

Antwort

2

Obwohl schwer, können Sie natürlich Reflexion verwenden, um die Baugruppe für diesen Test zu laden.

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

da die Montage noch nicht vorhanden ist:

Die folgende nicht funktionieren würde. Wenn ich es jedoch zuerst explizit über Reflektion und einen absoluten Pfad zu meinem Bin lade, kann ich das Objekt einfach instanziieren.

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

Der Grund für diese Notwendigkeit aus dem Direkt-Fenster ist, dass Ihre Anwendung geladen wird (oder Unit-Test-Anwendung in diesem Fall boostrapped), ist es für Referenzen im gesamten Code sieht und lädt die erforderlichen Baugruppen Ihre Bedürfnisse zu befriedigen. In Ihrem Fall haben Sie keinen expliziten Verweis auf die Assembly in Ihrem Code, sodass sie nicht geladen wird. Das unmittelbare Fenster hat keinen Kontext und muss daher explizit geladen werden.

Um mögliche zu programmierende Baugruppen programmatisch zu referenzieren, können Sie das Verzeichnis bin der geladenen Baugruppe verwenden. Dadurch können Sie den absoluten Pfad zur Laufzeit ziehen.

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

Gibt es eine Variable in VS, die auf den Build-Pfad oder das Nuget verweist, in dem sich die nuget-Pakete befinden? so dass man 'System.Reflection.Assembly sagen kann.LoadFile ($ nugetpath + "Newtonsoft.Json.dll") '? –

+1

@ CarloV.Dango Meine Antwort aktualisiert. Sie möchten nicht notwendigerweise auf die Paketquelle nuget verweisen (insbesondere, wenn man davon ausgeht, dass sich die aktuelle Struktur in vNext ändern wird). Das heißt, Sie können die Assemblys aus dem Verzeichnis bin des Einstiegspunkts der Anwendung ziehen. –

Verwandte Themen