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
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
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
Du fügst einen Verweis hinzu und benutzt die Klasse als wäre sie in deinem Programm deklariert.
ldr
Hallo,
//EDIT: Ich hatte nicht gelesen, dass es sich um eine selbsterstellte dll handelt.
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
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
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
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
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
Hallo joschika77,
für C#-DlLL brauchst du kein DllImport. Einfach als Verweis hinzufügen und die Klassen benutzen.
herbivore
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
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
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
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
Hallo joschika77,
ich sagte und meinte, dass die Klassen public sein müssen.
herbivore
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 :[
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
Die Klasse ClassLibraryTest.ETravelbookEntry, sowie alle Klassen die von Methoden zurückgegeben werden muss auch public sein.
ldr
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
Ok. Danke euch für die Mühen. Funzt jetzt. Nochmal danke.
Wer Wind sät wird Sturm ernten
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.
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.