2010-11-25 9 views
1

Ich habe es mit einem Teilzeit (und ärgerlichen) Bug mit einigen Erweiterungsmethoden in VB .NET (VS 2010 und VS 2008) zu tun.Teilzeit-Bug mit Extension-Methoden

Ich habe einige Client-Projekte, die einige Erweiterungsmethoden aus einem "Framework" -Projekt verwenden, das ich für allgemeine Zwecke erstellt habe.

Manchmal, wenn ich versuche, die Lösung zu starten, bekomme ich eine lange Liste von Fehler, die besagt, dass die Erweiterungsmethode "kein Mitglied von" Zielobjekt ist.

Wenn dies passiert, kann ich die Lösung ohne Fehler neu erstellen, aber wenn ich das Projekt erneut starte, wird der gleiche Fehler erneut ausgelöst.

Bisher habe ich 2 Abhilfe

A) über die Verlängerung Methodendefinition gehen, den Tag löschen, kompilieren (mit Fehlern), zurück, um den Tag legen.

B) Schließen Sie Visual Studio, und öffnen Sie es erneut.

Gibt es einen besseren Weg, um dieses Problem zu behandeln?

Antwort

4

Es gibt eine active bug report für dieses Problem bei Connect. Es gibt einen dringenden Bedarf für eine Repro, ein Projekt mit spezifischen Schritten, damit sie das Problem intern reproduzieren können. Vielleicht können Sie helfen, es wird benötigt, um es zu lösen oder eine Problemumgehung zu empfehlen.

EDIT: eine späte Ergänzung zu dieser Antwort, seit ich dies geschrieben habe gab es zusätzliche Fragen, die ein Problem mit dem IntelliSense-Parser unterscheidet sich vom Compiler. Es gibt ein Problem mit der Multi-Targeting-Funktion, insbesondere in VS2010, ausgelöst durch die Client-Profil-Option für .NET 4. Es ist der Standard für ein neues Projekt. Was schief geht, ist das Hinzufügen einer Assemblyreferenz, die das vollständige Profil erfordert, normalerweise aufgrund einer Abhängigkeit von System.Web. Sie werden eine Warnung dafür bekommen, aber das ist schnell mit einer großen Anzahl von Fehlern weggeblasen. Die Lösung besteht darin, das Framework-Ziel des Projekts vom Client auf voll zu ändern.

0

Eine weniger zeitaufwendige Arbeit als die beiden, die Sie aufgelistet haben, ist "Lösung neu erstellen" anstelle der normalen Build-Lösung. Das hat immer funktioniert, wenn ich auf dieses Problem stoße.

3

Ich habe vor kurzem das gleiche Problem aufgetreten. Mein Projekt würde nur gut bauen, aber wenn ich versuchte, die Rebuilt-Option zu verwenden, würde ich den Fehler bekommen, dass meine Erweiterungsmethoden nicht auf den Objekten gefunden wurden, die sie erweiterten.

Ich habe es geschafft, dies heute zu beheben, indem Sie einen Import an der Spitze der Klassen mit der Extension-Methode einfügen.

So am Anfang der Datei project_name.extension_module Ich habe eigentlich

Importe

Ich habe keine Ahnung, warum dies erforderlich ist, aber es behebt das Problem in meinem Fall. Ich hoffe, das hilft jemandem, der so viel Zeit damit verschwendet hat wie ich!

Liam

0

Wir haben etwas sehr ähnliches. Call-Erweiterungen merhod, die Typ A erweitert. Typ ist eigentlich eine Instanz des Typs B, die Schnittstelle C implementiert. Schnittstelle C hat eine Methode mit dem gleichen Namen wie die Erweiterungsmethode.

Schnittstelle C erklärt Methode Foo Klasse B erbt von A C

statische Klassen statische Methode Foo (dies A) implementiert Wenn A C ist (A wie C) .foo

Beim Debuggen In der Zeile, wenn A C ist, ruft es Foo mehrmals an und Sie können auf Assembly-Ebene gehen und sehen, dass es den Vergleich durchführt. Die Art, wie wir zeigen, dass der Aufruf geschieht, Foo führt eine SQL-Anweisung aus und wir können sehen, dass SQL Profiler den Code in Foo ausführt.

Ändern Sie A wie C zur Reflexion und Bug verschwindet. Oder benutze den Debugger versteckt/Schritt und Fehler ist maskiert. Auch wenn Sie den SQL-Profiler in Mikroschritt bringen, wird die Abfrage mehrmals (bevor Foo tatsächlich aufgerufen wird) für jede Assembly-Anweisung aufgerufen.