Laden...
FAQ

[FAQ] CS0234 / CS0246 - Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden

Erstellt von winSharp93 vor 16 Jahren Letzter Beitrag vor 16 Jahren 49.314 Views
winSharp93 Themenstarter:in
5.742 Beiträge seit 2007
vor 16 Jahren
[FAQ] CS0234 / CS0246 - Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden

Hallo Hilfesuchender,

wie der Titel bereits besagt, unterstützt dich dieser Beitrag bei der Behebung des **Compilerfehlers CS0234 sowie CS0246 **:

Der Typ- oder Namespacename Foo ist im Namespace Bar nicht vorhanden (Fehlt ein Assemblyverweis?)

beziehungsweise in Englisch:

The type or namespace name 'Foo' does not exist in the namespace 'Bar' (are you missing an assembly reference?)

oder

Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?)

bzw.

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:

Es wurde ein Typ erwartet. Folgende Gründe können vorliegen:
In der Kompilierung wurde nicht auf eine Assembly verwiesen, die die Definition eines Typs enthält. Verwenden Sie /reference (Metadaten importieren), um die Assembly anzugeben.

Sie haben einen Variablennamen an den typeof-Operator übergeben.

Informationen zum Hinzufügen eines Verweises in der Entwicklungsumgebung finden Sie unter Dialogfeld "Verweis hinzufügen".

Im folgenden Beispiel wird CS0234 generiert:

  
// CS0234.cs  
public class C  
{  
   public static void Main()  
   {  
      System.DateTime x = new System.DateTim();   // CS0234  
      // try the following line instead  
      // System.DateTime x = new System.DateTime();  
   }  
}  
  

bzw.

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: 1.Der Name des Typs oder des Namespaces, den Sie verwenden möchten, wurde falsch geschrieben. (Hierbei zählt auch die Groß- und Kleinschreibung.) Wenn der Name nicht richtig angegeben wurde, kann der Compiler die Definition für den Typ bzw. Namespace, auf den Sie im Code verwiesen haben, nicht finden. Dies ist häufig der Fall, weil in C# die Groß- und Kleinschreibung beachtet werden muss, beim Verweisen auf den Typ jedoch nicht die richtige Groß- und Kleinschreibung verwendet wurde. Dataset ds; generiert beispielsweise CS0246, weil das "s" in "Dataset" nicht groß geschrieben wurde.

1.Wenn der Fehler in Bezug auf einen Namespacenamen auftritt, wurde möglicherweise nicht auf die den Namespace enthaltende Assembly verwiesen (/reference). Beispiel: Der Code enthält using Accessibility;. Wenn das Projekt jedoch nicht auf die Assembly Accessibility.dll verweist, erhalten Sie CS0246. Informationen zum Hinzufügen eines Verweises in der Entwicklungsumgebung finden Sie unter Dialogfeld "Verweis hinzufügen".

1.Wenn der Fehler in Bezug auf einen Typnamen auftritt, wurde möglicherweise nicht die richtige using-Direktive verwendet, oder der Name des Typs war nicht voll qualifiziert. Betrachten Sie die folgende Codezeile: DataSet ds;. Um den Typ DataSet verwenden zu können, müssen Sie zwei Schritte ausführen. Zunächst müssen Sie einen Verweis auf die Assembly hinzufügen, die die Definition für den Typ DataSet enthält. Anschließend müssen Sie eine using-Direktive für den Namespace verwenden, in dem sich DataSet befindet. Beispiel: Da sich DataSet im System.Data-Namespace befindet, benötigen Sie am Anfang des Codes die folgende Anweisung: using System.Data;.

Der zweite Schritt ist nicht erforderlich Wenn Sie diesen Schritt jedoch auslassen, müssen Sie den Typ DataSet beim Verweisen auf ihn voll kennzeichnen. Dies bedeutet, dass Sie den Namespace und den Typ im Code bei jedem Verweis darauf verwenden. Wenn Sie also den zweiten Schritt ausgelassen haben, müssen Sie den oben stehenden Deklarationscode wie folgt ändern: System.Data.DataSet ds;.

1.Wenn der Fehler in Bezug auf ein Objekt auftritt, das kein Typ ist, wurde möglicherweise eine Variable verwendet, wo ein Typ erwartet wurde. Ein solcher Fehler wird beispielsweise verursacht, wenn in der is-Anweisung ein Typobjekt statt eines tatsächlichen Typs verwendet wird.

Im folgenden Beispiel wird CS0246 generiert:

  
// CS0246.cs  
// using System.Diagnostics;  
  
public class MyClass  
{  
   [Conditional("A")]   // CS0246, uncomment using directive to resolve  
   public void Test()  
   {  
   }  
  
   public static void Main()  
   {  
   }  
}  
  

Im folgenden Beispiel wurde ein Objekt des Typs Typ verwendet, wo tatsächlich ein Typ erwartet wurde (siehe Fall 4 oben):

  
// CS0246b.cs  
using System;  
  
class C  
{  
    public bool supports(object o, Type t)  
    {  
         if (o is t)  // CS0246 – t is not a type  
         {  
            return true;  
         }  
         return false;  
    }  
  
    public static void Main()  
    {  
    }  
}  
  




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:1.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.

1.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.

1.Nach Bestätigung mit Enter sollte in etwa Folgendes zu sehen sein:

1.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:
1.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“

1.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:

1.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:

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:
1.Hierzu öffnen wir die Eigabeaufforderung, indem wir Windows+R drücken, „cmd“ eingeben und mit Enter bestätigen. 1.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. 1.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“. 1.Anschließend läuft alles wie gehabt ab.
Hinweis: Die dll-Datei darf nach dem Registrieren nicht gelöscht werden!





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.