Einzelnen Beitrag anzeigen

jus

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

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

  Alt 26. Mai 2023, 02:16
Hallo,

ich bin am verzeifeln. Ich möchte in Delphi eine Methode von einer C# DLL aufrufen und einen array of record in Delphi bekommen. Das Record könnte so aussehen:
Delphi-Quellcode:
RMEDIA = packed record
  Name: String;
  ID: Integer;
end;
Dazu Ich habe einfach in Visual Studio 2019 eine "Class Library (.NET Framework)" Project erstellt und eine DLL mit einer einzigen Methode erstellt. Diese DLL lade ich einfach in Komponenten importieren->Typenbibliothek rein und erhalte eine TLB Unit in Delphi. Wenn die Funktionsparameter nur aus String oder Integer bestehen funktioniert es auch wunderbar. Doch wie kann ich von C# aus array of struct/record als Parameter übergeben?
Auf C# Seite habe ich mal folgendes versucht:
Code:
using System;
using System.Collections.Generic;

using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.InteropServices;


namespace DelphiTest
{
    public class CrossDLL
    {
        public struct RMEDIA
        {
            public String Name;
            public int ID;
        }

        public string HelloWorldArray(out RMEDIA[] structArray, ref int arraySize)
        {
            arraySize = 2;

            // Create an array of MyStruct
            structArray = new RMEDIA[arraySize];

            // Populate the array with data
            for (int i = 0; i < arraySize; i++)
            {
                structArray[i].ID = i + 1;
                structArray[i].Name = "Hallo";
            }
            return $"";
        }
    }
}
Wenn ich diese erstellte DLL in Delphi über die Komponente installieren->Typenbibliothek importierenreinlade erhalte folgende Methode:
function HelloWorldArray(out structArray: PSafeArray; var arraySize: Integer): WideString; Wenn ich folgendes versuche:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  CrossDLL: TCrossDLL;
  Items: PSafeArray;
  arraySize: Integer;
begin
  CrossDLL :=TCrossDLL.Create(self);
  CrossDLL.HelloWorldArray(Items, arraySize);
end;
bekomme ich gleich folgende eine Fehlermeldung:
Code:
---------------------------
Project1
---------------------------
Altes Format oder ungültige Typbibliothek. (Ausnahme von HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT))
---------------------------
OK  
---------------------------
Hat jemand einen Ansatz für mich?
  Mit Zitat antworten Zitat