AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Wie ein array of record von C# dll mit COM an Delphi übergeben?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie ein array of record von C# dll mit COM an Delphi übergeben?

Ein Thema von jus · begonnen am 26. Mai 2023 · letzter Beitrag vom 9. Jul 2023
Antwort Antwort
Seite 1 von 2  1 2      
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 26. Mai 2023, 15:35
@jaenicke: vielen Dank für den Hinweis mit dem DllExport. Wie so oft hast du mir ja schon weitergeholfen! Ich habe zwar nicht DllExport Package verwendet, sondern das Unmanaged Exports Nuget Package von Stackoverflow Beispiel verwendet. Ich habe das Unmanaged Exports Package von Robert Giesecke in mein Visual Studio 2019 Community Projekt installiert. Es gab zwar am Anfang paar Fallstricken bis es lief, aber dann habe ich einfach das Stackoverflow Beispiel hergenommen und das Record um weitere einfache Typen erweitert. Die Erweiterung funktionierte auf Anhieb. Falls es jemand interessiert, kann ich ja mal nachreichen.
Was dein Angebot bzgl. deinen Ansatz mit DllExport betrifft, so wäre ich sehr interessiert. Natürlich erst, wenn es dir wieder besser geht. Vielleicht könntest du ein kurzes Beispiel für DllExport zeigen. Wünsche gute Besserung!!!

lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.932 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 26. Mai 2023, 18:17
Ich habe zwar nicht DllExport Package verwendet, sondern das Unmanaged Exports Nuget Package von Stackoverflow Beispiel verwendet.
Das ist im Grunde das gleiche, auch von der Verwendung her. DllExport ist neuer, das Unmanaged Exports wird schon länger nicht mehr gepflegt, weshalb ich für neue Projekte das neuere empfehlen würde. Außerdem ist das durch den Wizard für die Projektkonfiguration sogar noch einfacher.

Was dein Angebot bzgl. deinen Ansatz mit DllExport betrifft, so wäre ich sehr interessiert.
Die Grundidee ist, dass man auf beiden Seiten je eine Klasse bereitstellt, die über eine exportierte Funktion verbunden werden. Dann fragt man an dieser Klasse ein Interface an, diese extrahiert die GUID und fragt die jeweils andere Seite danach. Die liefert dann ein passendes IInterface zurück, das man dann mit Supports in den konkreten Typ casten kann.

Darüber kann man dann noch einen generischen Aufsatz schreiben, damit es einfach zu verwenden ist.

Diesen Ansatz habe ich nun schon dreimal entworfen und er wurde jedesmal besser. Zuerst habe ich damit privat gespielt, aber das war nur ein Grundgerüst, dann habe ich es zweimal richtig für berufliche Zwecke implementiert, am Ende dann auch mit C#.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 26. Mai 2023, 21:43
...Das ist im Grunde das gleiche, auch von der Verwendung her. DllExport ist neuer, das Unmanaged Exports wird schon länger nicht mehr gepflegt, weshalb ich für neue Projekte das neuere empfehlen würde. Außerdem ist das durch den Wizard für die Projektkonfiguration sogar noch einfacher.
Hmm.. ich habe mir das Nuget Package "DllExport" über "Manage Nuget Packages..." von Visual Studio 2019 Community Edition in ein quasi leeres Projekt hinzugefügt.
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace DelphiCrossV2
{
    public class Test
    {
        [DllExport]
        public static int TestExport(int left, int right)
        {
            return left + right;
        }
    }
}
Es funktioniert bei mir irgendwie nicht. Irgendwas mache ich da falsch. Sobald ich den Befehl [DllExport] kommt da folgende Fehlermeldungen:
Code:
error CS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?)
error CS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.932 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 26. Mai 2023, 22:56
- Klassenbibliothek (.NET Framework) erstellen
- In den Projekteigenschaften unter Build --> Allgemein das Plattformziel auf x86 setzen
- Bezeichnungen der Klassen / Namespace usw. setzen
- DllExport installieren
--> Es öffnet sich dieses Fenster:
2023-05-26.png
Dort das Häkchen bei "Installed" setzen wie im Screenshot zu sehen und Apply drücken! Der Namespace sollte automatisch passen, wenn es ein neues Projekt ist, aber den kann man dort ggf. auch anpassen.

Dann auf Aufforderung des Visual Studios die Mappe neu laden (weil die Projektdatei extern geändert wurde).

Nun sollte DllExport gefunden werden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 27. Mai 2023, 23:27
- Klassenbibliothek (.NET Framework) erstellen
- In den Projekteigenschaften unter Build --> Allgemein das Plattformziel auf x86 setzen
- Bezeichnungen der Klassen / Namespace usw. setzen
- DllExport installieren
--> Es öffnet sich dieses Fenster:
Anhang 56072
Dort das Häkchen bei "Installed" setzen wie im Screenshot zu sehen und Apply drücken! Der Namespace sollte automatisch passen, wenn es ein neues Projekt ist, aber den kann man dort ggf. auch anpassen.

Dann auf Aufforderung des Visual Studios die Mappe neu laden (weil die Projektdatei extern geändert wurde).

Nun sollte DllExport gefunden werden.
ah ok, danke für die tolle Hilfestellung! Das mit dem installed Häkchen setzen habe ich nicht gewußt , ich dachte mit der Standardeinstellung funktioniert es schon. Da mein USG Router daheim abgeraucht ist, werde ich nächste Woche in der Firma es ausprobieren. Weiters muss ich zugeben, dass ich mich in VisualStudio C# überhaupt nicht firm bin. Gibt es irgendwelche guten Dokus oder Beispiele zum DllExport? Ich habe mir das Youtube Video und die paar wenige Beispiele von DllExport auf deren Github Hauptseite angeschaut, werde aber irgendwie nicht ganz schlau damit. Besonders die Attribute wie [Marshal...] und [LPArray...] usw., wo stehen diese Sachen eigentlich in der Doku drin?

Geändert von jus (27. Mai 2023 um 23:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.932 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 28. Mai 2023, 13:13
Besonders die Attribute wie [Marshal...] und [LPArray...] usw., wo stehen diese Sachen eigentlich in der Doku drin?
Zum Beispiel hier:
UnmanagedType Enumeration Referenz

Viel Material gibt es dazu aber wirklich nicht. Zum Beispiel musste ich auch erst herausfinden, dass man dabei ein paar Einschränkungen hat was Rückgabewerte usw. angeht.

Das größte Problem ist aber das Debugging. Visual Studio unterstützt bei solchen DLLs leider keinerlei Debugging, so dass man von Anfang an ein gutes Logging einbauen sollte.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (28. Mai 2023 um 13:15 Uhr)
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 2. Jun 2023, 20:31
- Klassenbibliothek (.NET Framework) erstellen
- In den Projekteigenschaften unter Build --> Allgemein das Plattformziel auf x86 setzen
- Bezeichnungen der Klassen / Namespace usw. setzen
- DllExport installieren
--> Es öffnet sich dieses Fenster:
Anhang 56072
Dort das Häkchen bei "Installed" setzen wie im Screenshot zu sehen und Apply drücken! Der Namespace sollte automatisch passen, wenn es ein neues Projekt ist, aber den kann man dort ggf. auch anpassen.

Dann auf Aufforderung des Visual Studios die Mappe neu laden (weil die Projektdatei extern geändert wurde).

Nun sollte DllExport gefunden werden.
ja, ok habe nun ausprobiert, es war tatsächlich nur das installed Häkchen, das gefehlt hat.

@jaenicke: Bei Übergabe von array of record/struct zwischen Delphiprogramm und einer Delphi DLL kann man natürlich locker ein array of record im Parameter übergeben. Zwischen Delphiprogramm und C DLL soll ja am besten nur den Zeiger auf den 1.Record vom Array geben und die Arrayanzahl. Aber wie kann man ein array of record/struct mit IInterface zwischen Delphiprogramm und C# übergeben? Wäre es dann eine InterfaceList statt einem Array?
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 7. Jul 2023, 09:37
Das ist im Grunde das gleiche, auch von der Verwendung her. DllExport ist neuer, das Unmanaged Exports wird schon länger nicht mehr gepflegt, weshalb ich für neue Projekte das neuere empfehlen würde. Außerdem ist das durch den Wizard für die Projektkonfiguration sogar noch einfacher.
Ja, bitte nutzt das neuere.
Ich habe vor weit über 10 Jahren aufgegeben, mit jeder neuen Version von msbuild oder .Net den Code anpassen zu müssen, der ildasm/ilasm findet.
War mir damals zu heikel es mit Mono.Cecil oder IKVM.Reflection zu machen.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.932 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 7. Jul 2023, 12:14
Vielen Dank für deine Antwort.

Mit neueren Versionen als .NET 4.8 habe ich allerdings auch mit der neueren Version noch ein paar Meinungsverschiedenheiten. Den Quelltext habe ich ja veröffentlicht. Wenn ich das mit .NET 6.0 oder so versuche, knallt es. Ich bin noch nicht dazu gekommen, mir das anzuschauen. Erst einmal muss ich noch die Anleitung fertig schreiben und dann habe ich noch ein paar andere Todos in dem Projekt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Wie ein array of record von C# dll mit COM an Delphi übergeben?

  Alt 8. Jul 2023, 11:20
Ich glaube nicht dass .net core überhaupt die Sachen hat, die sie damals für managed C++ und später C++/CLI eingebaut haben.
und das ist ja was ich da ausgenutzt habe
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz