Laden...

[gelöst] dll import mit vs2005

Erstellt von joschika77 vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.990 Views
joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren
[gelöst] dll import mit vs2005

Hallo,
kann mir jemand sagen wie ich eine selbst erstellte dll in meinen c# code mit vs2005 einbinde? Ich krieg das nicht hin. Hab hier zwar schon einiges gefunden aber das reicht leider nicht aus. Wer kann helfen?

MfG Ronnsen

Wer Wind sät wird Sturm ernten

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo joschika77,

Wer kann helfen?

du selbst, nämlich uns. Indem du sagst, was du probiert hast und welche Fehler du bekommst. Siehe [Hinweis] Wie poste ich richtig? Punkt 5.

Wie es geht, steht nämlich auf in der Doku und was sollen wir da jetzt anderes schreiben als das.

herbivore

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

ne ich bräuchte schritt für schritt, also vom einbinden bis zum aufrufen der Klassen & Methoden in der dll. Hab jetzt mal sowas probiert:



        public Form1()
        {
            InitializeComponent();
            [DllImport("ClassLibrary1.dll")]
            private static extern EDbConnection.openDatabase("Logbook", "Role_LogBook", "admin");
        }


aber so gehts nicht. Ach so, hab auch noch einen Verweis hinzugefügt. Ob ichs brauche weiß ich leider nicht.

MfG

Wer Wind sät wird Sturm ernten

243 Beiträge seit 2005
vor 16 Jahren

Du fügst einen Verweis hinzu und benutzt die Klasse als wäre sie in deinem Programm deklariert.

ldr

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo,

Aufrufe mit Pinvoke

//EDIT: Ich hatte nicht gelesen, dass es sich um eine selbsterstellte dll handelt.

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

Verweis habe ich hinzugefügt. Der kennt die Klasse nicht.


Fehler	1	Der Name "EDbConnection" ist im aktuellen Kontext nicht vorhanden.	C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\test\test\Form1.cs	27

Wer Wind sät wird Sturm ernten

243 Beiträge seit 2005
vor 16 Jahren

Erstmal brauchst du ein using, falls EDbConnection in einem anderen Namespace ist.

Und nun machst du folgendes:

Wenn die Methode (OpenDatabase) statisch ist

EDbConnection.OpenDatabase(...);

Wenn sie nicht-statisch ist, musst du erst eine Instanz erzeugen

EDbConnection c = new EDbConnection();
c.OpenDatabase(...);

ldr

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo joschika77,

die Klasse heißt ja auch Form1. Und nach private static extern darfst du meines Wissens nur einen einfachen und Methodennamen angeben.

Geht es um eine Methode aus einer C++ Klasse? Die kann man ohne Managed-C++-Warpper m.E. gar nicht aufrufen.

herbivore

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

diese EDbConnection Klasse ist in der dll-Datei & die Methoden davon sind alle statisch.
Was hat das mit dem namespace zu tun?

Mfg

Wer Wind sät wird Sturm ernten

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

hallo herbivore, ne ist alles c# code in der dll. Das dürfte nicht das Problem sein.
MfG

Wer Wind sät wird Sturm ernten

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo joschika77,

für C#-DlLL brauchst du kein DllImport. Einfach als Verweis hinzufügen und die Klassen benutzen.

herbivore

243 Beiträge seit 2005
vor 16 Jahren

Original von joschika77
diese EDbConnection Klasse ist in der dll-Datei & die Methoden davon sind alle statisch.
Was hat das mit dem namespace zu tun?

Mfg

Die statische Klasse liegt ja in einem Namespace


namespace foo
{
   static class EDbConnection
   {
      ...
   }
}

Wenn Form1 nicht im gleichen Namespace liegt (foo in diesem beispiel) musst du ein

using Foo;

an den Anfang der Datei schreiben.

ldr

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

ja dachte ich auch...funzt aber nicht. Hab ein ClassLibrary Projekt gemacht und verschiedene Klassen eingefügt. Und dort ist ja ein anderer Namespace, halt so wie das Projekt heißt. Liegt das dann vielleicht daran?

Wer Wind sät wird Sturm ernten

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo joschika77,

du kannst auf Klassen aus einer DLL genauso zugreifen wie auf die Framework-Klassen und musst genau das gleich tun, damit es funktioniert.

Die Klassen in der DLL müssen natürlich public sein.

herbivore

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

Hmmm... hört sich gut an. Die Methoden sind public.
Aber nun noch folgender Fehler:


Fehler	1	Der Zugriff auf "ClassLibraryTest.EDbConnection" ist aufgrund der Sicherheitsebene nicht möglich.	C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\ecnQueryTool\WebServiceTest\Form1.cs	28

MfG

Wer Wind sät wird Sturm ernten

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo joschika77,

ich sagte und meinte, dass die Klassen public sein müssen.

herbivore

243 Beiträge seit 2005
vor 16 Jahren

Original von joschika77
Hmmm... hört sich gut an. Die Methoden sind public.
Aber nun noch folgender Fehler:

  
Fehler	1	Der Zugriff auf "ClassLibraryTest.EDbConnection" ist aufgrund der Sicherheitsebene nicht möglich.	C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\ecnQueryTool\WebServiceTest\Form1.cs	28  
  

MfG

Aber die Klasse anscheinend nicht 😉 Denn Visual Studio fügt das Public bei neuen Klassen nicht selbst hinzu.

ldr

Edit: 5 Sekunden zu spät :[

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

Gut!Aber nun scheinen die Methoden damit ein Problem zu haben.


Fehler	1	Inkonsistenter Zugriff: Rückgabetyp "System.Collections.Generic.List<ClassLibraryTest.ETravelbookEntry>" ist weniger zugreifbar als Methode "ClassLibraryTest.EDbConnection.listOfTravelBookEntriesDB(System.DateTime, int)"	C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\ecnQueryTool\ClassLibrary1\EDbConnection.cs	419

MfG

Wer Wind sät wird Sturm ernten

243 Beiträge seit 2005
vor 16 Jahren

Die Klasse ClassLibraryTest.ETravelbookEntry, sowie alle Klassen die von Methoden zurückgegeben werden muss auch public sein.

ldr

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo joschika77,

so jetzt sind wir aber spätestens voll bei [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen). Zumal wenn Fehlermeldungen kommen, die wirklich genau sagen, wo das Problem liegt. Sowas musst du wirklich selber rausbekommen (lernen).

herbivore

joschika77 Themenstarter:in
191 Beiträge seit 2006
vor 16 Jahren

Ok. Danke euch für die Mühen. Funzt jetzt. Nochmal danke.

Wer Wind sät wird Sturm ernten

2.921 Beiträge seit 2005
vor 16 Jahren

Geht es um eine Methode aus einer C++ Klasse? Die kann man ohne Managed-C++-Warpper m.E. gar nicht aufrufen.

Mit einem Trick geht's schon. VTEntry im ILCode-Abschnitt manuell ändern, dann lassen sich sogar Exports für Unmanaged C++ von C# aus machen.
Aber ohne diesen Aufwand rein mit C#/.NET-Boardmitteln geht es nicht.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

D
386 Beiträge seit 2007
vor 16 Jahren

Du hast dich verlesen. Was nicht geht (nach wie vor nicht, deine Antwort hat nichts damit zu tun) ist die Nutzung von C++ Klassen und deren Methoden von C# aus. Das hat nichts mit Inverse P/I zu tun..

Pound for pound, plutonium is about as toxic as caffeine when eaten.