Seite 1 von 1

C# dll in PureBasic nutzen ?

Verfasst: 12.12.2019 16:14
von ccode_new
Hallo Leute,

ich möchte jetzt ganz allgemein Fragen ob jemand eine Anleitung hat/kennt, wie man evtl. C#.Net - Dlls mit PureBasic nutzen kann ?

Ganz allgemein und unspezifisch

Re: C# dll in PureBasic nutzen ?

Verfasst: 12.12.2019 19:03
von Kiffi
über die COM-Schnittstelle geht das ganz gut. Einer der vielen Treffer:

https://programmingistheway.wordpress.c ... sible-dll/

Wenn die DLL von Dir ist, dann sollte das kein Problem darstellen. Wenn nicht, dann müsstest Du u.U. noch eine Wrapper-DLL schreiben.

Grüße ... Peter

Re: C# dll in PureBasic nutzen ?

Verfasst: 12.12.2019 21:14
von ccode_new
Ach ja!
Das Ganze mit dem COM-Interface und der Sache "C++/CLI" ist mir noch zu kompliziert und zu aufwendig.

Ich bleibe erstmal bei der Lösung:

->Ein .Net - Konsolen-Programm erstellen (VB/C#)
->Dieses Programm kann dann über Konsolenparametern die .Net-Funktionen aus der aufgerufen .Net Dll ausführen.
->Dieses Hilfsprogramm wird dann über PureBasic mit unterschiedlichen Parametern (Funktionsaufrufe) gestartet.

Das ist nicht sehr schön und elegant, aber es ist einfacher.

Re: C# dll in PureBasic nutzen ?

Verfasst: 12.12.2019 21:29
von RSBasic
Normalerweise sind PB und .NET nicht miteinander kompatibel, weil .NET managed Code und PB unmanaged Code ist, aber du kannst den Code automatisiert als unmanaged Code nach außen bereitstellen, so dass man in PB auch auf eine mit C# geschriebene DLL-Datei und auf die einzelnen Assemblies zugreifen kann. Einfach nach "c# dllexport" googlen, dann findest du die Lösung.
Ich habe ja schon etliche .NET-Methoden für PB gewrappt.

COM würde ich nicht nutzen, wenn ich das hier lese:
NOTE: the framework of the project must be equal or lower the framework 3.5
:freak:

Und Aufrufe über Konsolenparametern würde ich nicht nutzen. Du hast damit immer irgendwelche Einschränkungen und Nachteile. Z.B. kannst du keine richtigen Objekte (z.b. Array) übergeben.

Deshalb würde ich immer die direkte Lösung und keine Workarounds nutzen.

Re: C# dll in PureBasic nutzen ?

Verfasst: 12.12.2019 21:47
von ccode_new
Und Aufrufe über Konsolenparametern würde ich nicht nutzen. Du hast damit immer irgendwelche Einschränkungen und Nachteile. Z.B. kannst du keine richtigen Objekte (z.b. Array) übergeben.

Deshalb würde ich immer die direkte Lösung und keine Workarounds nutzen.
Ja genau da trifft sich der Hammer mit den Daumen. (Oder so Ähnlich)

Re: C# dll in PureBasic nutzen ?

Verfasst: 12.12.2019 23:41
von helpy
ccode_new hat geschrieben:Ich bleibe erstmal bei der Lösung:

->Ein .Net - Konsolen-Programm erstellen (VB/C#)
->Dieses Programm kann dann über Konsolenparametern die .Net-Funktionen aus der aufgerufen .Net Dll ausführen.
->Dieses Hilfsprogramm wird dann über PureBasic mit unterschiedlichen Parametern (Funktionsaufrufe) gestartet.

Das ist nicht sehr schön und elegant, aber es ist einfacher.
Warum dann nicht gleich in .NET programmieren?
Ich mische ungern ... dann einfach für eine Sprache entscheiden!

Re: C# dll in PureBasic nutzen ?

Verfasst: 13.12.2019 11:58
von ccode_new
helpy hat geschrieben:Warum dann nicht gleich in .NET programmieren?
Ich mische ungern ... dann einfach für eine Sprache entscheiden!
Weil mir PureBasic mehr gefällt.
Das heißt ich komme besser damit klar.

Ich werde mir das hier mal genauer anschauen:

https://blog.xpnsec.com/rundll32-your-dotnet/

Wie verhält sich sowas bei Parameterübergaben (das kleinere Übel) und wie bei Funktionsrückgaben (das größere Übel) ?

Re: C# dll in PureBasic nutzen ?

Verfasst: 13.12.2019 12:13
von RSBasic
ccode_new hat geschrieben:Wie verhält sich sowas bei Parameterübergaben (das kleinere Übel) und wie bei Funktionsrückgaben (das größere Übel) ?
Ganzzahlen sind kein Problem. Bei Strings musst du marshalling machen, ist aber auch kein Problem.
Falls ich es nicht vergesse, kann ich heute Abend einen Beispielcode hier posten.
Aber grundsätzlich ist es kein Problem, Parameter (Ganzzahl, Float, Strings, Arrays) zu übergeben.

Ich würde aber ohne rundll32 nutzen und lieber direkt mit OpenLibrary() aufrufen. Dann muss nicht ein extra Prozess geöffnet werden.

Re: C# dll in PureBasic nutzen ?

Verfasst: 13.12.2019 21:51
von RSBasic
Hier eine Anleitung:
1. Erstelle mit Visual Studio eine Klassenbibliothek.
2. Installiere das Nuget-Paket: https://www.nuget.org/packages/UnmanagedExports/
3, Erstelle eine statische Methode und definiere sie als DLLExport:

Code: Alles auswählen

[RGiesecke.DllExport.DllExport]
public static int Test123() {
        //...
        return 1;
}
Übergabeparameter kannst du beliebig definieren. Beispiele:
Integer:

Code: Alles auswählen

int Value
String:

Code: Alles auswählen

[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string Value
Pointer:

Code: Alles auswählen

System.IntPtr Value
Wenn du einen String in einen out-Parameter zurückgeben möchtest:

Code: Alles auswählen

System.IntPtr Output

Code: Alles auswählen

byte[] OutputBytes = System.Text.Encoding.Unicode.GetBytes(string + "\0");
System.Runtime.InteropServices.Marshal.Copy(OutputBytes, 0, Output, OutputBytes.Length);
Array:

Code: Alles auswählen

System.IntPtr Array, int ArraySize

Code: Alles auswählen

for (int i = 0; i < ArraySize; i++) {
	var strPtr = (System.IntPtr)System.Runtime.InteropServices.Marshal.PtrToStructure(Array, typeof(System.IntPtr));
	if (strPtr == System.IntPtr.Zero) {
		break;
	} else {
		ArrayField = System.Runtime.InteropServices.Marshal.PtrToStringUni(strPtr);

		Array = new System.IntPtr(Array.ToInt64() + System.IntPtr.Size);
	}
}
Wenn du WinAPI in C# benutzen möchtest:

Code: Alles auswählen

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
Das sollten genug Beispielcodes sein.

Re: C# dll in PureBasic nutzen ?

Verfasst: 13.12.2019 23:46
von ccode_new
Vielen lieben Dank für die Mühe.