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.
Eigebunden ist sie unter Referenzen? Dann musst du hinzufügen: using name1;
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.
hi jankee
Ich würd die DLL halt gern in ein Unterverzeichnis legen.
Das wurde hier schon ein paar mal diskutiert
sbertl
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!
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
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
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ß
ö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...
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ß
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
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());
}
}
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 😉
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ß