Laden...

[erledigt] Probleme mit Verweisen in Anwendung/Klassenbibiothek

Erstellt von tresi vor 12 Jahren Letzter Beitrag vor 12 Jahren 17.708 Views
Thema geschlossen
T
tresi Themenstarter:in
8 Beiträge seit 2011
vor 12 Jahren
[erledigt] Probleme mit Verweisen in Anwendung/Klassenbibiothek

Hallo zusammen!

Ich bin blutiger Anfänger in Sachen C#, .Net usw. habe aber dennoch schon einige "Anwendungen" dank ausgiebiger Nutzung von Google realisieren können. Bisher habe ich alles selber auf die Reihe bekommen, aber mittlerweile bin ich seit 4 Tagen am Suchen einer Lösung und konnte bisher keine finden. Normalerweise lässt sich nahezu alles per Eigeninitiative lösen, wie ich es vor Jahren auch mit Linux gemacht habe. Diesmal weiß ich aber wirklich nicht weiter. Daher habe ich mich hier registeriert in der Hoffnung, dass mir geholfen werden kann. So genug gerede, jetzt komme ich zum Thema 😉

Ich habe mir unter Visual Studio 2010 C# Express eine Windows-Forms-Anwendung erstellt. Um mir wiederkehrende Aufgaben zu vereinfachen, habe ich mir gedacht, dass ich mir eine Klassenbibliothek erstelle, auf die ich von all meinen Projekten zugreifen kann. Das sind so Dinge wie eine Mssql/Mysql-Klasse, aber auch eine Klasse für ein Listview-Object, um z. B. Elemente zu verschieben usw.

Dieser Klassenbibliothek habe ich verschiedene Ordner hinzugefügt (Databases, Forms) und jeweils die passenden Klassen hineingelegt. Das Ganze läuft im Namespace de.meinedomain.Helpers, die Unterordner je halt de.meinedomain.Helpers.Databases usw). Zu guter letzt habe ich dieses Projekt meiner Projektmappe hinzugefügt und in meiner Windows-Anwendung über Verweis hinzufügen...->Projekte hinzugefügt. An den Stellen, wo es benötigt wird habe dich dann per Using-Direktive de.meinedomain.Helpers.Database; usw. eingefügt. Die Klassen selber habe ich alle explizit auf public gesetzt.

Ich bekomme per Code-Vervollständigung und auch Objektexplorer meine Namespaces und Klassen angezeigt und kann sie meiner Anwendung auch hinzufügen. Es wird auch nichts angekringelt und bei Methodenaufrufen wird mir auch der Konstruktor mit seinen Parametern richtig in der Code-Vervollständigung angezeigt. Also müsste doch eigentlich alles passen?

Sobald ich auf F5 drücke, unterkringelt er mir aber zwei Klassen, die ich initialisiere (Klasse var = new Klasse()) und sagt mir: Der Typ oder Namespace "bla" konnte nicht gefunden werden (Fehlt eine Using-Direktive oder en Assemblyverweis?). Nein - ich denke nicht, denn es wird ja alles korrekt angezeigt. Ich kann auch den kopletten Namespace angeben und per Codevervollständigung wird wieder alles korrekt angezeigt und trotzdem funktioniert es nicht!?

Nach langem, langem Googeln habe ich etliche Lösungsansätze gefunden, die bei mir aber alle nicht greifen. Z. B.

  • Die Klassenbibliothek von Ziel-Framework "DotNet 4.0 Client Profile" auf "DotNet 4.0" umgestellt, da die Anwendung auch so eingestellt ist.
  • Verweis Helpers: Interop-Typen Einbetten auf True gestellt. Dann sind zwar die Fehlermeldungen weg, aber es kommt dann die Meldung: "Interoptypen aus Assembly "c:\Users...\Visual Studio 2010\Projects\Helpers\bin\Debug\Helpers.dll" können nicht eingebettet werden, weil das ImportedFromTypeLibAttribute-Attribut oder das PrimaryInteropAssemblyAttribute-Attribut fehlt." Auch danach habe ich gegooglet, aber nichts gefunden, was mir helfen könnte.

Komisch ist, dass eine Klasse aus Helpers.Forms problemlos genutzt werden kann. Also muss die Einbindung doch korrekt sein...!?

Ich weiß echt nicht mehr weiter (es waren noch etlich andere Dinge, die ich probiert habe, die ich aber alle rückgängig gemacht habe, da sie nichts halfen).

Ich vermute in diesem Zusammenhang auch eine weitere Fehlermeldung: Bei der Zeile DataRowCollection Collection = new DataRowCollection(); aus einer meiner Database-Helpers-Klassen kommt die Meldung "Für den Typ "System.Data.DataRowCollection" sind keine Konstruktoren definiert." In meiner Forms-Anwendung funktioniert das problemlos. Entsprechend Using-Direktive System.Data ist natürlich jeweils gesetzt. Auch danach habe ich gegooglet, die Lösungs-Hilfe zur Fehlermeldung im MSDN hat jedoch (imho) gar nichts damit zu tun -> Compilerfehler CS0143: Für den Typ "Klasse" sind keine Konstruktoren definiert.

Ich bin echt für jeden Tipp dankbar. Ich habe zwar viel geschrieben, aber sicherlich einiges vergessen. Falls weitere Infos benötigt werden - kein Problem - ich gebe alles raus was hilft 😉

Jetzt hoffe ich mal, dass ich hier eine Lösung finden werde. Ich zähle auf Euch 🙂

Vielen lieben Dank im Voraus!

Grüße
Tresi

1.549 Beiträge seit 2004
vor 12 Jahren

Vür mich sieht das so aus als würde die assambly von deiner klassensamlung fehlen, überprüfe nochmal ob die auch wirklich referenziert ist

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

T
tresi Themenstarter:in
8 Beiträge seit 2011
vor 12 Jahren

Wow, das ging ja schnell 😃

Leider verstehe ich nicht, was damit gemeint ist schäm

Was genau muss ich nachsehen, prüfen, ändern? Irgendwas unter Projekteigenschaften->Anwendung->Assemblyinformationen... oder in der Assembly.cs oder...? In welchem Projekt (Anwendung oder Bibliothek)? Sorry, wie gesagt ich bin da noch sehr unbedarft 😦

Oder ist der "normale" Verseis unter Verweise im Projektexplorer gemeint? Der existiert ja. Ich habe dort das Projekt Helpers hinzugefügt...

1.029 Beiträge seit 2010
vor 12 Jahren

Hi,

den Fehler hatte ich auch mal.

Bei mir hat es gereicht bei den genutzten DLL's das Framework auf .NET 4 umzustellen.

Deshalb jetzt die blöde Frage:
Hast du's auch schon ohne "Interop-Typen einbetten" versucht ?

Das wäre nämlich meines Wissens nur bei Interop-Assemblies wie z.B. Office von Vorteil.

LG
Achim

T
tresi Themenstarter:in
8 Beiträge seit 2011
vor 12 Jahren

Morgen Taipi88,

vielen Dank für Deine Rückmeldung.

Ja, standardmässig ist das Einbetten von Interop-Typen ja deaktiviert. Dann kamen die vorher geschilderten Meldungen. Das Aktivieren der Option war nur eine von vielen Dingen, die ich ausprobiert habe... und nicht funktioniert hat... - leider.

Da es sich (noch) nicht um viele Klassendateien in meiner Projektmappe handelt, habe ich schon überlegt, einfach nochmal neue Projekte mit neuen Klassen anzulegen und die Inhalte der alten Dateien hineinzukopieren. Vielleicht habe ich mir ja irgendwas(auch immer) zerschossen und dann funktionierts wieder? Falls ich hier zwischenzeitig keine Lösung bekomme werde ich das mal ausprobieren.

Weitere Tipps? 😉

771 Beiträge seit 2009
vor 12 Jahren

Hi tresi,

schon mal in [FAQ] CS0234 / CS0246 - Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden alle Lösungen durchgegangen?

Wenn der Compiler nur einige Klassen aus deiner Klassenbibliothek nicht findet, kann es vllt. sein, daß du noch eine ältere Version eingebunden hast, d.h. lösche den Verweis mal und binde ihn dann noch mal neu hinzu.

T
tresi Themenstarter:in
8 Beiträge seit 2011
vor 12 Jahren

@Cat:
Selbstverständlich habe ich den Artikel schon gelesen. Leider hilft mir der aber nicht weiter. Ich habe den Verweis genauso angelegt und außerdem wird im Objektkatalog der Namespace usw. korrekt angezeigt. Ebenso in der Code-Vervollständigung.

Ob ich per using de.meinedomain.Helpers.xxx und nachher Klasse abc = new abc() oder nur de.meinedomain.Helpers.xxx.abc abc = new de.meinedomain.Helpers.xxx.abc() verwende, die Code-Vervollständigung zeigt alles korrekt an und auch Rechtschreibfehler sind so ausgeschlossen. Daher verstehe ich ja nicht, was VS von mir will 😉

Oder habe ich eventuell etwas in dem Beitrag überlesen?

Grüße
Tresi

771 Beiträge seit 2009
vor 12 Jahren

Hi tresi,

dann poste mal die (ersten) Fehler und die zugehörigen Codestellen.

Kompiliert denn die Klassenbibliothek einwandfrei? (weil du ja etwas von "DataRowCollection Collection = new DataRowCollection();" schreibst (und diese Klasse hat nun mal keinen öffentlichen Konstruktor, da Instanzen dieser Klasse direkt von der DataTable verwaltet werden).

T
tresi Themenstarter:in
8 Beiträge seit 2011
vor 12 Jahren

Gerne. Es handelt sich dabei aber nur um eine Variableninitialisierung im Klassenkopf:

frmMain.cs


...
using de.meinedomain.Helpers.Databases;
...

namespace de.meinedomain.Projektname
{
    public partial class frmMain : Form
    {
        protected DatabaseMySql test1;
        protected DatabaseMsSql test2;
        ...
    }

    ...
}

Diese beiden Angaben werden per Codevervollständigung automatisch so gefunden, beim Debuggen aber sofort angemängelt.
Fehlermeldungen:
Der Typ oder Namespace "DataBaseMySql" konnte nicht gefunden werden (Fehlt eine Using-Direktive oder en Assemblyverweis?)
Der Typ oder Namespace "DataBaseMsSql" konnte nicht gefunden werden (Fehlt eine Using-Direktive oder en Assemblyverweis?)

DatabaseMySql.cs


using System;
using System.Data;
using System.Data.SqlClient;
using ...

namespace de.meinedomain.Helpers.Databases
{
    ...

    public DataRowCollection FetchAll()
    {
        DataRowCollection Collection = new DataRowCollection();
        while (true)
        {
            DataRow Row = Fetch();
            if (Row == null)
            {
                break;
            }
            Collection.Add(Row);
        }
        return Collection;
    }
    ...
}


Hier wird die Zeile DataRowCollection Collection = new DataRowCollection(); bemängelt.

Ich hatte das vorher genau so direkt in meiner Froms-Klasse integriert und das funktionierte. Da ich im Moment mit C# am herumspielen bin, wollte ich das dann auch gleich in eine Klassenbibliothek ausgliedern. Seitdem funktioniert leider nichts mehr...

771 Beiträge seit 2009
vor 12 Jahren

Hallo tresi,

zuerst musst du ja einmal die Fehler in deiner Klassenbibliothek lösen.
Der Code kann auch in einer Form-Klasse nicht compiliert haben (wie schon von mir oben beschrieben).

T
tresi Themenstarter:in
8 Beiträge seit 2011
vor 12 Jahren

zuerst musst du ja einmal die Fehler in deiner Klassenbibliothek lösen.

Vielen Dank für diesen banalen Hinweis 😃

Ich habe an der falschen Stelle angefangen das Problem anzugehen. Und du hast recht, so konnte das vorher auch nicht funktioniert haben. Irgendwie muss ich beim Umbauen und dem vielen Lesen durcheinander gekommen sein. So kann man natürlich auch keine DataRowCollection benutzen. Ich habe das jetzt erstmal in eine ArrayList umgebaut (ich muss mir nochmal die verschiedenen Klassen in den Collections genau ansehen) und dadurch funktioniert alles! Ich war felsenfest davon überzeugt, dass die Verweise nicht passen und hätte ich hier nicht angefragt, hätte ich auch in fünf Wochen noch hier gesessen und wahrscheinlich entnervt aufgegeben und das Kapitel C# beendet.

Naja, als Newbie darf/kann einem das passieren (hoffe ich) 😉

Nochmals vielen Dank an alle Beteiligten und natürlich ganz besonders an Cat 😃

Grüße
Tresi

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo tresi,

passieren kann dir das als Newbie schon, das ist kein Beinbruch. Allerdings hattest du eigentliche alle Informationen, die du brauchst. Insbesondere in der FAQ. Bei allem Verständnis für Anfänger, sehen es nicht gerne, wenn zu solchen Grundlagen Threads eröffnet werden. Siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

BTW: ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

herbivore

Thema geschlossen