wie der Titel bereits besagt, unterstützt dich dieser Beitrag bei der Behebung des Compilerfehlers CS0234 sowie CS0246 :
Zitat |
Der Typ- oder Namespacename Foo ist im Namespace Bar nicht vorhanden (Fehlt ein Assemblyverweis?) |
Zitat |
The type or namespace name 'Foo' does not exist in the namespace 'Bar' (are you missing an assembly reference?) |
Zitat |
Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?) |
Zitat |
The type or namespace name 'Foo' could not be found (are you missing a using directive or an assembly reference?) |
Generell sei gesagt, dass gerade Anfänger versuchen sollten, Syntaxfehler selbst zu beheben. Weitere Informationen hierzu finden sich in [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) .
Die :rtfm: MSDN sagt zu diesem Fehler:
Zitat |
Es wurde ein Typ erwartet. Folgende Gründe können vorliegen:
Im folgenden Beispiel wird CS0234 generiert:
|
Zitat |
Ein Typ konnte nicht gefunden werden. Möglicherweise haben Sie vergessen, auf die den Typ enthaltende Assembly zu verweisen (/reference), oder Sie haben ihre Verwendung mit der using-Direktive nicht ordnungsgemäß qualifiziert. Für diesen Fehler gibt es mehrere Gründe:
Im folgenden Beispiel wird CS0246 generiert:
Im folgenden Beispiel wurde ein Objekt des Typs Typ verwendet, wo tatsächlich ein Typ erwartet wurde (siehe Fall 4 oben):
|
Lösen wir das Problem nun Schritt für Schritt:
Sehr häufig kommt es vor, dass es gar nicht notwendig ist, dem Projekt einen Assemblyverweis hinzuzufügen, wenn einfach nur die entsprechende Using-Klausel fehlt. Ist dies der Fall, hilft uns VS weiter, indem wir den Cursor innerhalb des Typnamens (in diesem Fall SoapFormatter) platzieren. Ist nun ein dunkelrotes Rechteck links unten am Typnamen zu sehen (siehe Abbildung), bewegen wir die Maus darauf und klicken auf eine der beiden Optionen.


Ansonsten haben wir, wie immer, die Möglichkeit, in die :rtfm: MSDN oder den Objektbrowser zu schauen, um herauszufinden, in welchem Namespace ein Typ liegt.
Wenn wir die MSDN verwenden möchten, navigieren wir zur Startseite der Library und Suchen nach dem Typ. Irgendwann sollten wir eine Seite, ähnlich dieser finden:

Unter Umständen findet man den entsprechenden Beitrag aus der MSDN schneller, wenn man eine externe Suchmaschine bemüht.
Nun die Vorgehensweise mit dem Objektbrowser:
- Um den in VS integrierten Objektbrowser anzuzeigen, reicht es aus, „Ansicht – [Weitere Fenster] - Objektbrowser“ bzw. „View – [Other Windows] – Object Browser“ zu wählen oder „Strg+W, J“ zu tippen.
- Nun werden uns alle verfügbaren Assemblies in einer Liste angezeigt. Da wir auf der Suche nach einem bestimmten Typ sind, verwenden wir die eigebaute Suchfunktion (oberhalb der Liste) und tippen dazu den Namen des Types, nach dem wir suchen, im Beispiel „SoapFormatter“ in das Textfeld ein.
- Nach Bestätigung mit Enter sollte in etwa Folgendes zu sehen sein:
- Dieser Ansicht können wir nun den vollständigen Namespace entnehmen.
Sollten wir bei der Suche in der MSDN und im Objektbrowser keine Ergebnisse finden, kann es eigentlich nur sein, dass wir uns vertippt haben (Auch Groß- / Kleinschreibung!) oder der entsprechende Typ Teil einer Library eines Fremdherstellers ist. Im letzteren Fall hilft nur eine intensive Suche mit einer Suchmaschine oder genaues Durchblättern des Buches, in dem der Typ erwähnt wird.
Haben wir allerdings Ergebnisse gefunden und das manuelle Hinzufügen einer entsprechenden Using-Klausel behebt das Problem nicht, bzw. verursacht eine neue, ähnliche Fehlermeldung oder das dunkelrote Rechteck wird nicht angezeigt, müssen wir einen Assemblyverweis hinzufügen. Dazu gehen wir wie folgt vor:
- Als erstes müssen wir herausfinden, in welcher Assembly der Typ definiert ist. Dazu nutzen wir entweder die MSDN, indem wir genauso vorgehen, wie oben beschrieben. Nur müssen wir uns diesmal die Assembly merken.
Oder wir verwenden wieder den Objektbrowser:
Nachdem wir den Typ gesucht und gefunden haben, klicken wir nun mit der rechten Maustaste auf „System.Runtime.Serialization.Formatters.Soap.SoapFormatter“ in der Ergebnisliste und wählen im Kontextmenü „Definition durchsuchen“ bzw. „Browse Definition“.
Jetzt lässt sich klar erkennen, in welcher Assembly der gesuchte Typ liegt – in unserem Fall in „System.Runtime.Serialization.Formatters.Soap“
- Im Anschluss daran fügen wir nun im Projektmappenexplorer bzw. im Solution Explorer einen Verweis auf die Assembly hinzu, indem wir mit der rechten Maustaste auf „Verweise“ bzw. „Reference“ klicken und „Verweis hinzufügen“ bzw. „Add Reference“ im daraufhin erscheinenden Kontextmenü wählen:
- Im Fenster, das sich nun öffnet, brauchen wir nichts weiter zu tun, als die Assembly aus der Liste im Tab „.NET“, wenn sich die Assembly im GAC befindet, auszuwählen und mit „OK“ das Fenster zu schließen. Soll hingegen ein Verweis auf ein Projekt der aktuellen Projektmappe hinzugefügt werden, müssen wir zuvor zum Tab „Projekte“ bzw. „Projects“ wechseln. Ebenso ist es möglich, eine Komponentendatei (.dll, .tlb, .olb, .ocx, .exe, .manifest) als Verweis einzufügen. Hierzu muss der Tab „Durchsuchen“ bzw. „Browse“ gewählt werden:
- Hierzu öffnen wir die Eigabeaufforderung, indem wir Windows+R drücken, „cmd“ eingeben und mit Enter bestätigen.
- Hinweis für Vista-Benutzer: Da regsvr32 unbedingt als Administrator ausgeführt werden muss, weil sonst eine Fehlermeldung angezeigt wird, müssen wir den Umweg über „C:\Windows\System32“ gehen und dort die Anwendung „cmd“ mit der rechten Maustaste anklicken, um „Als Administrator ausführen“ auswählen zu können.
- Nun tippen wir (ohne Anführungszeichen) „regsvr32 [DllName]“ ein, wobei „[DllName]“ für den vollständigen Pfad zu der COM-Komponente steht, also z.B.: „regsvr32 E:\Test.dll“.
- Anschließend läuft alles wie gehabt ab.
Hinweis: Die dll-Datei darf nach dem Registrieren nicht gelöscht werden!
Handelt es sich hingegen um einen COM-Verweis, können wir wie ab Schritt 3 vorgehen, mit der Ausnahme, dass wir den Tab „COM“ wählen.
Wird die COM-Komponente, auf die wir einen Verweis hinzufügen möchten, nicht in der Liste angezeigt, müssen wir diese zunächst mit dem Tool regsvr32.exe registrieren:
Nun noch die Vorgehensweise für alle csc-Nutzer:
Zunächst sollten wir uns im klaren sein, dass bestimmte Assemblyverweise, die in der Datei csc.rsp stehen, automatisch eingebunden werden, sofern csc nicht mit /noconfig aufgerufen wird.
Müssen weitere Verweise hinzugefügt werden, empfiehlt sich die Verwendung des Schalters /reference:[Ziel] (Kurzform: /r:[Ziel]). Siehe hierzu auch /reference in der MSDN.
Ergänzungen von herbivore:
Wenn /r verwendet wird, muss die Assembly entweder im Suchpfad zu finden sein oder der (absolute) Pfad zur Assembly muss explizit mit angegeben werden.
Steht eine Klasse (Methode, Property, ...) erst ab einer bestimmten .NET-Framework-Version zur Verfügung, muss man mindestens diese Framework-Version als Zielframework einstellen oder auf die Klasse verzichten, um die hier genannten Fehler zu verhindern.
Ab .NET 4.0 wird zusätzlich zwischen normalem Framework und Client Profile unterschieden. Im Client Profile fehlen die Klassen, die typischerweise nur für Serveranwendungen benötigt werden. Benutzt man im Code eine solche Klasse, obwohl man als Zielframework das Client Profile ausgewählt hat, bekommt man eine der hier besprochenen Fehlermeldungen. In diesem Fall muss man das normale Framework als Ziel auswählen oder auf die Klasse verzichten. Siehe auch Assemblys im .NET Framework-Clientprofil.