Frage

Ich habe eine Klassenbibliothek mit einigen Erweiterungsmethoden in C # geschrieben und einer alten Website in VB geschrieben.

Ich möchte meine Erweiterungsmethoden aus dem VB-Code nennen, aber sie erscheinen nicht in intelisense und ich kompilieren erhalten Fehler, wenn ich die Website besuchen.

Ich habe alle gewünschten Importieren s, weil andere in den gleichen Namensraum enthaltenen Klassen in Intelisense fein erscheinen.

Alle Vorschläge

EDIT:. Mehr Infos mit einigen Kommentaren helfen

meine Implementierung sieht wie folgt aus

//C# code compiled as DLL
namespace x.y {
    public static class z {
        public static string q (this string s){
             return s + " " + s;
        }

    }
}

und meine Nutzung wie diese

Imports x.y

'...'
Dim r as string = "greg"
Dim s as string = r.q() ' does not show in intelisense
                        ' and throws error : Compiler Error Message: BC30203: Identifier expected.
War es hilfreich?

Lösung

Es funktioniert für mich, obwohl es ein paar Macken sind. Zuerst habe ich eine C # Klassenbibliothek .NET 3.5-Targeting. Hier ist der einzige Code in dem Projekt:

using System;

namespace ExtensionLibrary
{
  public static class Extensions
  {
    public static string CustomExtension(this string text)
    {
      char[] chars = text.ToCharArray();
      Array.Reverse(chars);
      return new string(chars);
    }
  }
}

Dann habe ich eine VB-Konsole app .NET 3.5 und hat einen Verweis auf meine C # Projekt Targeting. I umbenannt Module1.vb zu Test.vb, und hier ist der Code:

Imports ExtensionLibrary

Module Test

    Sub Main()
        Console.WriteLine("Hello".CustomExtension())
    End Sub

End Module

Dies kompiliert und ausgeführt. (Hätte ich die Methode reverse () genannt, aber ich war nicht sicher, ob VB könnte Fähigkeiten magisch schon irgendwo umkehren haben. - Ich bin kein Experte VB durch eine lange Kreide)

Am Anfang war ich nicht Extension Library als Import von Intellisense angeboten. Auch nach dem Bau ist die „Import Extension Library“ abgeblendet und eine Glühbirne bietet die Möglichkeit, die angeblich redundanten Import zu entfernen. (Doing bricht so das Projekt.) Es ist möglich, dass dies ReSharper eher als Visual Studio, Geist Sie.

So eine lange Geschichte kurz zu machen, es kann getan werden, und es sollte gut funktionieren. Ich nehme nicht das Problem ist, dass Sie entweder eine alte Version von VB oder Ihr Projekt zielt nicht .NET 3.5?

Wie in den Kommentaren darauf hingewiesen: Es gibt eine weitere Marotte, die das Methode Erweiterung ist nicht gefunden werden, wenn der Kompilierung-Typ des Ziels Object wird .

Andere Tipps

Erweiterungsmethoden sind nur syntaktischer Zucker für statische Methoden. So

public static string MyExtMethod(this string s)

kann mit sowohl in VB.NET und C # aufgerufen werden

MyExtMethod("myArgument")

OK. Auf der Grundlage der Fehlermeldung Sie auf jeden Fall sind nicht unter Verwendung der neuesten Version VB (VB 9!) Oder den Fehler nicht auf dieses Problem überhaupt im Zusammenhang, weil dann würden Sie einen anderen Fehler, wenn die Methode erhalten nicht gefunden wurde:

  

Fehler 1 'q' ist kein Mitglied von 'String'.

Imports x.y

'...'
Dim r As String = "greg"
Dim s As String = r.q() 'same as z.q(r) 

Ich glaube, ich habe ein ähnliches Problem aufgetreten : VB.Net ist recht glücklich Erweiterungsmethoden zu kompilieren auf durch und lassen sie gefolgert zur Laufzeit, wenn Option Strict ausgeschaltet ist.

Allerdings scheint VB.Net wirklich nicht Erweiterungsmethoden auf Grundtypen zu mögen. Sie können nicht Object erweitern und es kann es nicht lösen, wenn Sie tun:

C #

namespace NS
...

public static class Utility {

    public static void Something(this object input) { ...

    public static void Something(this string input) { ...

}

// Works fine, resolves to 2nd method
"test".Something();

// At compile time C# converts the above to:
Utility.Something("test");

Doch das geht schief in VB.Net:

Option Infer On
Option Explicit On
Option Strict Off
Imports NS
...

    Dim r as String = "test" 
    r.Something()

Das kompiliert ohne Fehler, aber zur Laufzeit fehlschlägt, weil Something keine Methode String ist -. Die Compiler den syntaktischen Zucker des Erweiterungsmethode ersetzen mit dem statischen Aufruf Utility.Something

fehlgeschlagen

Die Frage ist, warum? Nun im Gegensatz zu C #, VB.Net kann keine Erweiterung Griff Object ! Die gültige Erweiterung Methode in C # verwechselt die VB.Net-Compiler.

Als allgemeine Regel VB.Net, würde ich mit Erweiterungsmethoden mit einem der grundlegenden .NET-Typen (Object, String, Integer, usw.) vermeiden. Sie müssen auch mit Option Infer vorsichtig sein, da während sie standardmäßig in Visual Studio auf es ist standardmäßig deaktiviert ist für Befehlszeile kompiliert, VBCodeProvider und möglicherweise in Web-Site (abhängig von Ihrer web.config). Wenn es ausgeschaltet ist alles in VB.Net gilt als eine Object und alle Erweiterungsmethoden werden bis zur Laufzeit gelassen werden (und werden daher nicht).

Ich denke, Microsoft wirklich den Ball fallen gelassen, wenn sie Erweiterungsmethoden VB.Net hinzugefügt, halte ich es für ein nachträglicher Einfall war, zu versuchen (und nicht), um es mit C # konsistent.

Ich weiß nicht, wenn man sich in der gleichen Punktnotation nennen kann, wie Sie in C # würden, aber ich würde denken, dass die statischen Erweiterungsmethoden würden als statische Funktionen mit der Faust Argumente als der erweiterten Typ angezeigt. So sollten Sie die eigentlich Klasse in VB nennen können, mit:

StaticClass.ExtensionMethod(theString, arg1, ..., argN)

Wo in C #, würden Sie gerade geschrieben:

theString.ExtensionMethod(arg1, ..., argN);

Mit StaticClass der Name der statischen Klasse zu sein, in dem Sie Ihre Erweiterungsmethoden definiert.

  

... und eine alte Website in VB geschrieben.

Ist „alter“ hier impliziert vielleicht, dass man auch hier eine alte Version von VB verwenden? Wie auch immer, da Erweiterungsmethoden nur Vanille statisch ( „Shared“) Verfahren dekoriert mit einem Attribut sind, können Sie sollte Lage sein, sie auf jeden Fall zu nennen.

Wenn dies nicht möglich ist, entweder Sie versuchen, sie zu nennen „-Erweiterung Stil“ in einer alten Version von VB oder Sie verweisen die falsche Version von C # Montage.

Edit: sind Sie sicher, dass Sie Importing den ganzen Namensraum, das heißt x.y und nicht nur x? VB ist in der Lage verschachtelten Namespaces zugreifen einfacher als C #, so dass Sie Klassen von Namespace x.y mit dem folgenden Code in VB verwenden können. Doch für Erweiterungsmethoden zu arbeiten, die voll Pfad Imported werden muss.

Imports x
Dim x As New y.SomeClass()

Zwei Dinge zu überprüfen:

  1. Sie Targeting .Net 3.5
  2. Sie Verweis auf die DLL

Einige Tools könnten darauf hindeuten, falsch Erweiterungsmethoden für Projekte, die sie nicht unterstützen.

Ich lief in das gleiche Problem, und zufällig auf die Lösung gestoßen haben könnte. Wenn ich verwende

x.y.r.q()

, warf sie den gleichen Fehler für mich. Aber wenn ich x.y importiert, es funktionierte, so:

using x.y;
...
r.q()

war in Ordnung.

So anscheinend haben Sie es in der Erklärung zu importieren, damit es funktioniert.

Das war schon eine ganze Weile her und ich kann wirklich nicht, wie ich es gelöst, aber unnötig zu sagen, es war Benutzerfehler. Ich wahrscheinlich meinen Computer neu gestartet und weg ging es weiter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top