Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

[erledigt] Probleme mit Verweisen in Anwendung/Klassenbibiothek
tresi
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

[erledigt] Probleme mit Verweisen in Anwendung/Klassenbibiothek

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tresi am .
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1.549
Herkunft: Sindringen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tresi
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1.029
Herkunft: Mainz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tresi
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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? ;)
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 771

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Cat am .
private Nachricht | Beiträge des Benutzers
tresi
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

@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
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 771

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
tresi
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 771

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
tresi
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers