Laden...

probleme mit einer dll

Erstellt von Yankee vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.930 Views
Y
Yankee Themenstarter:in
14 Beiträge seit 2006
vor 17 Jahren
probleme mit einer dll

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.

822 Beiträge seit 2005
vor 17 Jahren

Eigebunden ist sie unter Referenzen? Dann musst du hinzufügen: using name1;

Y
Yankee Themenstarter:in
14 Beiträge seit 2006
vor 17 Jahren

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.

822 Beiträge seit 2005
vor 17 Jahren

hi jankee

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

W
117 Beiträge seit 2005
vor 17 Jahren

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!

822 Beiträge seit 2005
vor 17 Jahren

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

W
117 Beiträge seit 2005
vor 17 Jahren

Sorry, habs leider nur so überflogen...

V
52 Beiträge seit 2006
vor 17 Jahren

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

Y
Yankee Themenstarter:in
14 Beiträge seit 2006
vor 17 Jahren

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ß

347 Beiträge seit 2006
vor 17 Jahren

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

Y
Yankee Themenstarter:in
14 Beiträge seit 2006
vor 17 Jahren

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ß

L
667 Beiträge seit 2004
vor 17 Jahren

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

347 Beiträge seit 2006
vor 17 Jahren

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 😉

Y
Yankee Themenstarter:in
14 Beiträge seit 2006
vor 17 Jahren

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ß