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

  • »
  • Community
  • |
  • Diskussionsforum
probleme mit einer dll
Yankee
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

probleme mit einer dll

beantworten | zitieren | melden

Hi

Ich hab mir jetzt schon einige Beiträge zu dem Thema angeschaut, war eigentlich auch der Meinung das ich alles so gemacht hab wie beschrieben, aber ich bekomm immer wieder ein Problem.

Meine Dll


using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace name1
{
    public class class1
    {
        public void method1()
        {
           Console.WriteLine("Hallo");
           Console.ReadLine();
        }
    }
}


Mein Quelltext


using System;
using System.Collections.Generic;
using System.Text;

namespace conapp
{
    class Program
    {
        static void Main(string[] args)
        {
            name1.class1 a = name1.class1();
            a.test();
        }
    }
}

Die Fehlermeldung sagt mir das der Namespace name1 nicht gefunden wurde.


Ich kann method1 nur verwenden wenn ich die DLL als Reverenz in mein Projekt aufnehme. Dann muss die DLL später aber im selben Verzeichnis liegen wie die EXE.

Kann mir jeman sagen wie ich es schaffe die DLL einzubinden bzw. die Methode zu verwenden wenn die DLL in einem Unterverzeichnis liegt?

Im Voraus für jede Hilfe schon mal danke.
private Nachricht | Beiträge des Benutzers
sbertl000
myCSharp.de - Member

Avatar #avatar-2350.png


Dabei seit:
Beiträge: 822
Herkunft: Wien

beantworten | zitieren | melden

Eigebunden ist sie unter Referenzen? Dann musst du hinzufügen: using name1;
private Nachricht | Beiträge des Benutzers
Yankee
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Hi sbertl000,

muss ich sie dann aber immer über die Referenzen einbinden?

Die Beiträge die ich gelesen hab, ham mir den Eindruck vermittelt das ich sie dann nicht unbedingt als Ref einbinden muss sondern sie einfach zur Verfügung stellen (PATH Variable), kam mir zwar komisch vor da das Programm ja nich alle DLLs überprüfen kann, aber da ich mich mit den Dingen nich besonders gut auskenn war mir des dann auch unwichtig.

Ich würd die DLL halt gern in ein Unterverzeichnis legen.
private Nachricht | Beiträge des Benutzers
sbertl000
myCSharp.de - Member

Avatar #avatar-2350.png


Dabei seit:
Beiträge: 822
Herkunft: Wien

beantworten | zitieren | melden

hi jankee
Zitat
Ich würd die DLL halt gern in ein Unterverzeichnis legen.

Das wurde hier schon ein paar mal diskutiert

Verzeichnis für DLL vorgeben

sbertl
private Nachricht | Beiträge des Benutzers
wpb
myCSharp.de - Member



Dabei seit:
Beiträge: 117
Herkunft: Austria

beantworten | zitieren | melden

Hy!

Also ich bin mir zwar nicht sicher, aber ich glaube, dass du die DLL einbinden musst (Referenz).

Und dann noch

using name1

Bin mir aber nicht sicher!
private Nachricht | Beiträge des Benutzers
sbertl000
myCSharp.de - Member

Avatar #avatar-2350.png


Dabei seit:
Beiträge: 822
Herkunft: Wien

beantworten | zitieren | melden

Zitat
Original von wpb
Hy!

Also ich bin mir zwar nicht sicher, aber ich glaube, dass du die DLL einbinden musst (Referenz).

Und dann noch

using name1

Bin mir aber nicht sicher!

genau das hab ich eh oben geschrieben


sbertl
private Nachricht | Beiträge des Benutzers
wpb
myCSharp.de - Member



Dabei seit:
Beiträge: 117
Herkunft: Austria

beantworten | zitieren | melden

Sorry, habs leider nur so überflogen...
private Nachricht | Beiträge des Benutzers
v1vec
myCSharp.de - Member



Dabei seit:
Beiträge: 52

beantworten | zitieren | melden

und genau das is unnötig, da:

name1.class1 a = name1.class1();
ob man jetzt nämlich

name1.class1 a;
oder

using name1;
class1 a;
schreibt is egal

PS: Referenz braucht man natürlich trotzdem
private Nachricht | Beiträge des Benutzers
Yankee
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Hi

erstmal danke für die Hilfe.
Funktioniert jetzt.

Jetzt hab ich aber noch eine Zusatzfrage:

Wenn ich DLLs über Referenz erst einbinden muss, muss ich vor dem compilieren wissen welche DLLs später von meinem Programm gebraucht werden.
Gibt es da ne Möglichkeit zur Laufzeit den Namen einer DLL festzulegen, aus der die Funktion stammen soll ?

Gruß
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

öhm,... du musst schon eine Instanz deiner Klasse anlegen um die Referenz in a zu packen. Man beachte das "new":

DeinNameSpace.DeineKlasse a = new DeinNameSpace.DeineKlasse();
Ob using oder Peng, das ist nur eine Abkürzung um nur den Teil hinter dem letzten Punkt tippen zu müssen.
Wichtig ist nur, dass du die Assembly auch referenzierst.

btw: Bitte, bitte, mit Zucker obendrauf nennt Assemblies (vor allem in Threadtiteln!!) nicht DLL. Ich dachte zum Beispiel hier ging es um eine richtige DLL...
private Nachricht | Beiträge des Benutzers
Yankee
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Hi Robert G,

auf deine Bitte hin hab ich mal in der MSDN nach "assembly" gesucht. So wich ich das verstehe sind assemblys alles C#-DLLs die alle referenziert werden müssen.
Also kann ich diese nicht zur Laufzeit meines Progs festlegen.

Geht das dann mit C/C++ DLLs ( muss ich dann über [DLLInport()] einbinden )
da hab ich aber noch nichts gelesen und kann nicht sagen ob das was ich grad schreib quatsch ist.

Gruß
private Nachricht | Beiträge des Benutzers
Lynix
myCSharp.de - Member



Dabei seit:
Beiträge: 667
Herkunft: Saarland

beantworten | zitieren | melden

Du brauchst NICHT unbedingt eine statische Referenz (Projektverweis). Stattdessen kannst Du mal hier im Forum oder in der MSDN unter Assembly.Load() bzw. Activator.CreateInstance gucken.

Viel Glück,
Lynix
"It is not wise to be wise" - Sun Tzu
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

Zitat
Original von Yankee
Hi Robert G,

auf deine Bitte hin hab ich mal in der MSDN nach "assembly" gesucht. So wich ich das verstehe sind assemblys alles C#-DLLs die alle referenziert werden müssen.
Also kann ich diese nicht zur Laufzeit meines Progs festlegen.
Doch kannst du.
Du musst aber etwas haben, gegen das du kompilieren kannst um auf bestimmte Funktionalität in den Klassen der dynamisch geladenen Assembly zugreifen zu können.

Mögich wäre sowas wie das abstrakte Beispiel hier:

pulic interface ISayHello
{
   string SayHello();
}

Dieses Interface packst du jetzt in eine Extra-Assembly, welche von deiner App und den dynamischen Assemblies referenziert wird: Sozusagen eine rudimentäre PlugIn API.

In der dyn. Assembly kannst jetzt das machen:

public class SampleClass : ISayHello
{
   public string SayHello()
   {
      return "Hello!";
   }
}

Assembly dynamicLib = Assembly.LoadFrom("BliBlaBlubb.dll");

foreach (Type loadedType in dynamicLib.GetExportedTypes())
{
	if (typeof (ISayHello).IsAssignableFrom(loadedType))
	{
		ISayHello instance = Activator.CreateInstance(loadedType, null) as ISayHello;
		Console.WriteLine("{0} says \"{1}\"",
		                  instance,
		                  instance.SayHello());
	}
}


Zitat
Geht das dann mit C/C++ DLLs ( muss ich dann über [DLLInport()] einbinden )
da hab ich aber noch nichts gelesen und kann nicht sagen ob das was ich grad schreib quatsch ist.
Das geht prinzipiell auch mit nativen DLLs[1], die heißen ja nicht umsonst dynamic Link Library.
Das dyn. Laden in .Net stellt dich allerdings vor ein paar Hürden. Solange du sie nur dyn. Laden aber nicht wieder Entladen wilst gibt es sicher zig Beispiele im Netz (codeproject.com!), welche das DllImportAttribute und die passende Methode zur Laufzeit generieren. Falls nicht kann ich dir eine Lib von mir geben die DLs auch entladen kann. Das erkaufst du dir dann aber mit einigen Einschränkungen bei der Parameterübergabe(keine Unicode zum Beispiel).

Der reine .Net Weg oben ist aber definitiv zu empfehlen, wenn du nicht darauf angewiesen bist, dass native Sprachen PlugIns schreiben können. Ist einfach hübscher.

[1]welche einfach so anders benutzt werden, dass ich um die generelle namentliche Trennung Assembly <-> DLL bat
private Nachricht | Beiträge des Benutzers
Yankee
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Dann mal an alle die mir geholfen haben großen Danke

einen Teil hab ich schon umgesetzt der funktioniert, den Rest probier ich so bald ich Zeit hab aus

werd mich dann erst mal hinsetzen und mich tiefer in C# einlesen

Gruß
private Nachricht | Beiträge des Benutzers