Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

C DLL aus C# .NET Applikation aufrufen

Yves3 / 7 Antworten / Baumansicht Nickles

Hallo,

Ich habe eine alte, in C geschriebene COM DLL, die ich von meiner ASP.NET Webapplikation aus aufrufen muss.
Mein erster Versuch war folgender:
- DLL mit regsvr32 registrieren
- Bei Visual Studio.NET über ADD Reference einbinden (Visual Studio kümmert sich angeblich automatisch um den ganze Managed<->unmanaged Kram)
- Funktionen aus der DLL aufrufen

Ist irgendwie zu einfach, um funktionieren zu können, nicht? ;)
Ich konnte es problemlos kompilieren, es lief "exeptionfrei" durch, gab aber immer null zurück und machte schlicht nicht das was es sollte (nämlich gar nichts).

In einem zweiten Versuch machte ich es dann so wie hier beschrieben:
http://www.aspheute.com/english/20000828.asp
Das Resultat war genau das gleiche wie bei Versuch 1.

Wird die DLL auf dem selben Computer und mit den selben Parametern von einem VB-Script aufgerufen, so funktioniert es.

Any Ideas?

bei Antwort benachrichtigen
xafford Yves3 „C DLL aus C# .NET Applikation aufrufen“
Optionen

Wie hast Du die Funktionen aus der DLL aufgerufen?

Versuch es mal mit

using System.Runtime.InteropServices;

und nicht vergessen:

[DllImport("hier_deine.dll")]
public static extern hier_die_Deklaration_der_zu_verwendenden_Funktion

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Yves3 xafford „Wie hast Du die Funktionen aus der DLL aufgerufen? Versuch es mal mit using...“
Optionen
Wie hast Du die Funktionen aus der DLL aufgerufen?
So (es ist genau genommen nur eine Funktion):
ChangeDcePwAdminClass DceObject = new ChangeDcePwAdminClass();
DceObject.ChangeDcePwAdminBSTR(m_strConnectionString, m_strUser, m_strPW, m_strUserToChange, strNewPW);
string ret = DceObject.ChangeDcePwAdminStatusBSTR;

und nicht vergessen:

[DllImport("hier_deine.dll")]
public static extern hier_die_Deklaration_der_zu_verwendenden_Funktion

Soviel ich weiss, muss man das bei COM nicht so machen, sondern nur bei "normalen" unmanaged dll's. Oder liege ich da falsch?
Wie gesagt, Kompilieren und Ausführen ging einwandfrei, bis auf die Tatsache eben, dass das Passwort nicht wie erwünscht zurückgesetzt wird.
bei Antwort benachrichtigen
xafford Yves3 „ So es ist genau genommen nur eine Funktion : ChangeDcePwAdminClass DceObject...“
Optionen
Soviel ich weiss, muss man das bei COM nicht so machen, sondern nur bei "normalen" unmanaged dll's. Oder liege ich da falsch?

Ups, ja Du hast recht. Sorry auf Anhieb fällt mir da auch nichts mehr ein.
Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
PaoloP Yves3 „C DLL aus C# .NET Applikation aufrufen“
Optionen

Hallo,

Ist die DLL ein einfaches COM-Object oder Active-X ?


Gruß
PP

http://www.microsoft.com/germany/msdn/library/components/ActiveXUndCOMKomponenten.mspx?mfr=true

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Yves3 PaoloP „Hallo, Ist die DLL ein einfaches COM-Object oder Active-X ? Gruß PP...“
Optionen

So, Problem gelöst.
Ich habe heute den ganzen Tag an dem Ding rumgebastelt. Zuerst hatte die Idee, noch eine reine C-Dll dazwischen zu schalten, die ich dann vom managed Code aus aufrufen kann. Da ich vorher noch nie aus reinem C eine COM DLL verwendet hatte, brauchte ich ziemlich lange, bis es schliesslich lief.
Seltsamerweise hatte ich dort genau das gleiche Problem, wie bei meinen vorigen Versuchen, und konnte wieder von vorne anfangen. Glücklicherweise erhielt ich dann doch noch den Code für das Teufelsding.
Darauf habe ich gleich all den COM-Mist gelöscht und eine reine C-DLL erstellt, die die benötigte Funktion exportiert. Die rufe ich jetzt so aus der managed-Umgebung auf, wie von xafford beschrieben.

... und das klappt ENDLICH :)

bei Antwort benachrichtigen
PaoloP Yves3 „So, Problem gelöst. Ich habe heute den ganzen Tag an dem Ding rumgebastelt....“
Optionen

Naja du hast das Problem erfolgreich umgangen ja :)
Gelöst wär natürlich schöner gewesen, hätte mich auch interessiert.

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Yves3 PaoloP „Naja du hast das Problem erfolgreich umgangen ja : Gelöst wär natürlich...“
Optionen

Ja, mich hätte es auch interessiert. Aber meiner Meinung nach ist es so sogar besser als mit COM, von daher kann ich es verkraften. (COM kam meines Wissens sowieso nur zum Einsatz, weil das alte Frontend eine ASP Seite war und das der DLL zugrunde liegende API für C ist.)
Knacknüsse gibt es bei diesem Projekt noch genug, langweilig wird mir also auch nicht so schnell. ;)

bei Antwort benachrichtigen