PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#-Code aus dll aufrufen


Gast
2009-09-26, 15:17:33
Hi,

Also ich hab ein C# Programm welches eine dll Datei einbindet, welche in C geschrieben ist. Dann kann das C# Programm ja Problemlos den C Code aufrufen.

Ich möchte das jetzt aber so machen, dass der C Code ebenfalls die Möglichkeit hat eine Funktion im C# Programm aufzurufen.

Geht das?

Coda
2009-09-26, 17:43:50
Welcher Compiler?

ScottManDeath
2009-09-26, 19:49:00
Entweder die DLL als COM Objekt verpacken, oder in C++/CLI eine Wrapper DLL mit C Interface fuer die C# Assembly bauen.

Coda
2009-09-27, 03:12:22
Ich würd einfach gleich ein Managed-Interface um den C-Code bauen per C++/CLI. Deshalb frag ich ja nach dem Compiler ;)

Gast
2009-09-27, 11:50:32
Ja ist Visual Studio 2008.
Das mit dem managed interface klingt interessant.
Wo kann ich mehr dazu erfahren?

Gast
2009-09-27, 17:52:55
Was relativ einfach geht, ist wenn du dem C-Code einfach eine Struktur mit Funktionspointern übergibst (RegisterCallbacks / whatever).

Das kannst in < 5 Minuten implementieren.

Delegate auf die Funktion -> Marshalling -> Funktionspointer -> C-Dll

C-Dll -> Funktionspointer -> Magie -> Gewünschte C# Funktion

Du musst halt darauf achten, dass die Delegates "länger leben" als die C-Dll diese benötigt.

Gast
2009-09-27, 19:31:58
Erstmal danke für die Erklärung.
Aber ich versteht das jetzt irgendwie noch nicht.
Also wenn ich C-Code sage, dann mein ich nativen C-Code, kein CLI gedöns.

Aus deiner Anleitung werd ich auch nicht schlau.
Hätte jemand irgendwo ein konkretes Beispiel?

SamStone
2009-09-27, 19:59:42
Ok schon gut hat sich erledigt, hab dazu was in msdn gefunden.

EDIT: Für die die sich wundern: Der Gast da oben war ich. ;)

SamStone
2009-09-28, 22:09:18
Ich hab jetzt nochmal eine Frage mit dem dot net dll Zeug.

Also ich will jetzt eine DLL Datei in C++/CLI geschrieben, die hat eine Methode die z.B. so aussieht (ohne namespace und alles):
void test()
{
}

Wie ich gelesen habe funktioniert das exportieren mit __declspec(dllexport) in dot net nicht so richtig, und stattdessen muss man die Funktionen gar nicht extra zum exportieren markieren.


Jetzt hab ich noch ein C# Programm, welches diese test() methode benutzen soll. Dem C# Projekt hab ich natürlich als Referenz schon diese C++/CLI DLL Datei gegeben.
Wie rufe ich denn diese test() Methode dann jetzt auf?
Also wie mache ich meinem C# Programm klar das diese Funktion existiert etc.?

Habs schon mit
[DllImport("DLL.dll")]
static extern void test();
versucht, aber das will er so nicht.

mekakic
2009-09-29, 16:11:00
Funktioniert das eigentlich beim Ausführen von native Code in C# beim Absturz dieses, das mit einer Exception abzufangen oder was passiert dann? Oder kann man C++ Exceptions vom native Code in C# abfangen?

Coda
2009-09-29, 16:37:09
Bei einer Null-Pointer-Dereferenzierung bekommt man z.B. "An unhandled exception of type 'System.NullReferenceException' occurred"

Das sollte man eigentlich abfangen können.

Gast
2009-09-29, 19:28:34
Ok mein Problem hat sich jetzt auch erledigt *g*.

Gnafoo
2009-10-07, 23:38:59
Funktioniert das eigentlich beim Ausführen von native Code in C# beim Absturz dieses, das mit einer Exception abzufangen oder was passiert dann? Oder kann man C++ Exceptions vom native Code in C# abfangen?

Interessante Frage. Ich habe auf die Schnelle folgendes gefunden:

http://stackoverflow.com/questions/150544/can-you-catch-a-native-exception-in-c-code

Siehe insbesondere den letzten Post. Offensichtlich werden die Exceptions zum Teil auf die .NET-Exceptions gemappt, bei COM auf eine COMException und für den Rest auf SEHException.