tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von sheel
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
741
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    FJK FJK ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    171
    ich hoffe ich bin hier im richtigen Bereich.

    Also ich habe folgendes problem
    Ich habe in c# Visual Studio 10 Express eine dll geschrieben.

    In der Klasse in der dll, habe ich eine private string Variable, in der ich je nach bedarf Statusmeldungen schreibe.
    Über eine get Methode soll diese ausgelsen werden.

    Wenn ich die dll in einem Test Programm einbaue und auf diesen String über die Methode zugreifen will, stürzt das Programm ab. Er zeigt mir hierbei eine Fehlermeldung das der Code nicht Verfügbar ist. Also denke ich das er mir wärend der Debug Sesion die Fehlerhafte Zeile zeigen will, was er natürlich nicht kann, weil sie in der dll steht.
    Andere Methoden, in der ich etwas in den String schreibe, führt er ohne Probleme aus. Ob er hier natürlich was in den String schreibt kann ich nicht kontrollieren

    Binde ich die dll, als Klasse ein, also die Datei Dll.cls führt er den Code aus und macht was er soll.

    Ich weiß das eine dll reine Maschinensprache ist, gibt es daher keine Internen Variablen, die solange die Klasse existiert erhalten bleiben? Das kann ich mir ehrlichgesagt nicht vorstellen, aber zur Zeit weiß ich nicht woran es sonst liegen könnte.

    Bei bedarf zeig ich euch gerne Code Beispiele, aber wie gesagt als Klasse hinzugefügt funktioniert es.

    Außerdem benutze ich in der dll die Schnittstelle, um sie nicht jedesmal zu öffnen und zu schließen wollte ich gerne das schließen in den Destruktor setzen, aber C# und Destruktor...?
    gibt es sowas noch, teilweise erlaubt er mir das ~ und machnchmal kreidet er mir das als Fehler an. Gibt es vieleicht irgendwas in der dll was aufgerufen wird wenn sie geschlossen wird?

    danke
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi

    Zitat Zitat von FJK Beitrag anzeigen
    ich hoffe ich bin hier im richtigen Bereich.
    Ja.

    Zitat Zitat von FJK Beitrag anzeigen
    Also ich habe folgendes problem
    Ich habe in c# Visual Studio 10 Express eine dll geschrieben.
    2010?

    Zitat Zitat von FJK Beitrag anzeigen
    Wenn ich die dll in einem Test Programm einbaue und auf diesen String über die Methode zugreifen will, stürzt das Programm ab. Er zeigt mir hierbei eine Fehlermeldung das der Code nicht Verfügbar ist. Also denke ich das er mir wärend der Debug Sesion die Fehlerhafte Zeile zeigen will, was er natürlich nicht kann, weil sie in der dll steht.
    Andere Methoden, in der ich etwas in den String schreibe, führt er ohne Probleme aus. Ob er hier natürlich was in den String schreibt kann ich nicht kontrollieren
    Zeig einmal einen Screenshot deines Projektmappenexplorers. Und wie lädst du die DLL?
    Und am besten auch gleich den Code.

    Zitat Zitat von FJK Beitrag anzeigen
    Ich weiß das eine dll reine Maschinensprache ist
    Bei C#.NET nicht.
    Ja bei C/C++-Dlls, .NET hat aber ein eigenes Binärformat.

    Zitat Zitat von FJK Beitrag anzeigen
    Außerdem benutze ich in der dll die Schnittstelle, um sie nicht jedesmal zu öffnen und zu schließen wollte ich gerne das schließen in den Destruktor setzen, aber C# und Destruktor...?
    gibt es sowas noch, teilweise erlaubt er mir das ~ und machnchmal kreidet er mir das als Fehler an. Gibt es vieleicht irgendwas in der dll was aufgerufen wird wenn sie geschlossen wird?
    Es gibt einen Destruktor.
    Und Finalize.
    (Und teilweise Dispose).

    Zeig einmal die Codestellen, die falsch sein sollen.

    Gruß
     

  3. #3
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von FJK Beitrag anzeigen
    Wenn ich die dll in einem Test Programm einbaue und auf diesen String über die Methode zugreifen will, stürzt das Programm ab. Er zeigt mir hierbei eine Fehlermeldung das der Code nicht Verfügbar ist.
    Du kannst das DLL-Projekt ja noch der Solution des Testprogrammes hinzufügen. Dann wird auch der Code gefunden.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  4. #4
    FJK FJK ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    171
    Hi,
    danke für die Antworten.

    ok die sache ist mir jetzt etwas peinlich, der Fehler lag bei mir selber.
    Ich habe den Code natürlich im Debbuger getestet und bin mit step durchgetakert.
    Als er dann die DLL aufrufen wollte, wollte er sie natürlich aufrufen, dies konnte er nicht
    Bin eigendlich davon ausgegangen das er den Code dann überspringt, wie von einer Lib.
    Hab dann gedacht das der Fehler darauf beruht das ein Fehler in der DLL liegt und der Debbuger mir diesen zeigen wollte

    Ja 2010, gibt es noch eine andere VC Express 10 version?

    ich füge die Dll, mit "Verweis Hinzufügen" hinzu, in der Projektmappe wird die dann aufgeführt.
    Kann ich es noch anders einbinden, so das ich auch beim Debbugen die Codezeile mit einzelstep ausführen kann?

    Zitat
    Zitat von FJK Beitrag anzeigen
    Ich weiß das eine dll reine Maschinensprache ist
    Bei C#.NET nicht.
    Ja bei C/C++-Dlls, .NET hat aber ein eigenes Binärformat.
    hmm ok, kann die DLL dann trotzdem in anderen Sprachen verwendet werden?

    gruß
     

  5. #5
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Zitat Zitat von FJK Beitrag anzeigen
    Ja 2010, gibt es noch eine andere VC Express 10 version?
    Nein, ich hab nur nachgefragt um sicher zu gehen.

    Zitat Zitat von FJK Beitrag anzeigen
    hmm ok, kann die DLL dann trotzdem in anderen Sprachen verwendet werden?
    Teilweise.
    Eine C# (.NET)-DLL ist eben keine DLL im C++-Sinn-nur die Dateiendung ist gleich.
    Du kannst die DLL mit allen .NET-Sprachen verwenden: C#, VB.NET, C++CLI...
    Aber nicht mit C, C++ und ähnlichem.

    Gruß
     

  6. #6
    FJK FJK ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    171
    Auch dann nicht wenn das DotNet Framework installiert ist?
     

  7. #7
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Das muss sowieso installiert sein, damit du irgendein .NET-Programm/DLL/... ausführen kannst.
    Also auch für ein Hello-World-Programm in C#.

    Das ist ja der große Unterschied zwischen .NET und Rest:
    Ein normales C++-Programm wird beim kompilieren in Prozessorbefehle übersetzt, die direkt reingeladen und ausgeführt werden können.
    Ein .NET-Programm wird beim kompilieren in ein eigenes Dateiformat übersetzt, mit dem der Prozessor nichts anfangen kann.
    Dafür gibts dann das .NET-Framework: Enthält unter anderem Programme (bzw. irgendwas, das sich in Windows einbindet), die diese .NET-Dateien lesen können und dann wirklich das machen, was sie tun sollen.

    Hat alles Vorteile und Nachteile, aber das ist jetzt nebensächlich.

    Also: Eine .NET-DLL hat mit einer C-DLL nur das ".dll" gemeinsam - fertig.
    Man kann diese Welten nicht einfach so vermischen.

    Gruß
     

  8. #8
    FJK FJK ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    171
    Zitat Zitat von sheel Beitrag anzeigen
    Das muss sowieso installiert sein, damit du irgendein .NET-Programm/DLL/... ausführen kannst.
    Also auch für ein Hello-World-Programm in C#.

    Das ist ja der große Unterschied zwischen .NET und Rest:
    Ein normales C++-Programm wird beim kompilieren in Prozessorbefehle übersetzt, die direkt reingeladen und ausgeführt werden können.
    Ein .NET-Programm wird beim kompilieren in ein eigenes Dateiformat übersetzt, mit dem der Prozessor nichts anfangen kann.
    Dafür gibts dann das .NET-Framework: Enthält unter anderem Programme (bzw. irgendwas, das sich in Windows einbindet), die diese .NET-Dateien lesen können und dann wirklich das machen, was sie tun sollen.

    Hat alles Vorteile und Nachteile, aber das ist jetzt nebensächlich.

    Also: Eine .NET-DLL hat mit einer C-DLL nur das ".dll" gemeinsam - fertig.
    Man kann diese Welten nicht einfach so vermischen.

    Gruß

    ja das ist klar,
    meine Frage zielte eher darauf ab wie man teiles seines C# Codes auch in anderesn Sprachen nutzen kann, also abseits von C# und .net.
    gibt es den eine Möglichkeit ein Code in C# so zu "verpacken" das man ihn auch in c++ nutzen kann?
    Meine überlegungen dachten da an eine dll, aber das schein ja jetzt hinfällig.
    Geändert von FJK (15.03.11 um 16:20 Uhr)
     

  9. #9
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Möglich ist das schon: C++CLI lässt .NET-Zeug und natives C/C++ gemischt zu.
    Du kannst dir also in C++CLI eine DLL schreiben, die in C/C++-Art Funktionen anbietet, die wiederum C#-Methoden aufrufen.
    Diese natürlich auch irgendwo verfügbar = noch eine DLL.

    Gruß
     

  10. #10
    FJK FJK ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    171
    wenn ich dafür schon c++ nutzen muss, wäre es doch einfacher eine c++ dll zu schreiben, oder kann eine c++ dll auch nicht in c# genutzt werden?
     

  11. #11
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Nein. Hab ich doch schon mehrfach geschrieben:

    C/C++-Programme und DLLs kompilieren ins "echte" Exe/DLL-Format
    C# und alle anderen .NET-Sprachen machen zwar auch Exe/Dll-Dateien, die aber außer der Dateierweiterung nicht viel mit den anderen gemeinsam haben und nicht damit kompatibel sind.

    C-DLLs können in C# nicht verwendet werden und umgekehrt.
    Schon zB deswegen nicht, weil in C# alles aus Klassen besteht und eine C-DLL nur Einzelfunktionen exportiert.
    Sowas gibts in C# nicht einmal. Klassen gibts zwar in C++, aber nicht in C, wo DLLs ja auch verwendbar sein sollten.
    Oder was soll denn ein int sein? Wirklich nur 4 Byte oder eine Struktur, die von Object erbt und noch ein paar Methoden(auch statische) mitbringt? Und was ist Object in C?
    ...

    Wie gesagt: Eine C++CLI-DLL ist die einzige sinnvolle) Möglichkeit.
    C++CLI ist eine von mS entwickelte C++-Abart (so wie C# ja auch mit Java Gemeinsamkeiten hat...), in der aber das .NET-Framework verwendet wird.
    Allerdings hat C++CLI unter den .NET-Sprachen eine Sonderstellung:
    Man kann auch "echten" C/C++-Code in die gleiche Quelltextdatei dazumischen.
    Der wird dann wie normales C++ mitkompiliert.

    Deswegen kann man sogenannte Wrapper erstellen: Eine C++CLI-DLL kann die Funktionalität von .NET-Klassen als Echt-C-Funktionen anbieten (und umgekehrt).
    Man muss nur überlegen, wie man die Klasse am besten in Einzelfunktionen aufteilt.

    zB ein init, das in der DLL ein neues .NET-Objekt anlegt,
    andere Funktionen, die von dem Methoden aufrufen...

    Gruß
    FJK bedankt sich. 

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Zitat Zitat von sheel Beitrag anzeigen
    C-DLLs können in C# nicht verwendet werden und umgekehrt.
    Das ist nicht ganz richtig. C-DLLs kann man relativ problemlos in .NET über P/Invoke einbinden.

    Wenn man wirklich eine Bibliothek für unmanaged und managed schreiben will, ist C++/CLI die erste Wahl. Man kann eine mixed-mode Assembly erstellen, die aus beiden System genutzt werden kann. (Stichwort: IJW)

    Eine weitere Möglichkeit wäre jeweils eine C++ Bibliothek für .NET und eine als native Bibliothek aus den gleichen Quellen zu erzeugen (mit #ifdef).

    Für den umgekehrten Weg von native zu .NET gibt es COM Interop.

    Siehe z.B. http://msdn.microsoft.com/en-us/library/ms973872.aspx

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Probleme beim Ausführen
    Von Baopi im Forum Java
    Antworten: 15
    Letzter Beitrag: 26.10.10, 12:57
  2. Antworten: 8
    Letzter Beitrag: 23.09.08, 21:20
  3. Probleme beim Ausführen einer jar-Datei im Browser
    Von thobeoz im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 14.09.08, 18:16
  4. Probleme beim Ausführen meiner .exe
    Von Mahatmas im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 25.10.07, 07:50
  5. Antworten: 0
    Letzter Beitrag: 12.01.06, 14:34