C# dll in PureBasic nutzen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

C# dll in PureBasic nutzen ?

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: C# dll in PureBasic nutzen ?

Beitrag 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
Hygge
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C# dll in PureBasic nutzen ?

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: C# dll in PureBasic nutzen ?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C# dll in PureBasic nutzen ?

Beitrag 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)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: C# dll in PureBasic nutzen ?

Beitrag 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!
Windows 10
PB Last Final / (Sometimes testing Beta versions)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C# dll in PureBasic nutzen ?

Beitrag 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) ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: C# dll in PureBasic nutzen ?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: C# dll in PureBasic nutzen ?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C# dll in PureBasic nutzen ?

Beitrag von ccode_new »

Vielen lieben Dank für die Mühe.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten