Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   Aufruf von .net Core 3.1 Assemblies (https://www.delphipraxis.net/203276-aufruf-von-net-core-3-1-assemblies.html)

Sergej_Molotov 31. Jan 2020 09:20

Aufruf von .net Core 3.1 Assemblies
 
Hallo Zusammen,

ich bin gerade auf der Suche nach einem Beispiel, wie man aus einer Delphi Anwendung heraus eine .Net Core 3.1 Assembly (nicht .Net Framework) aufrufen kann. Bei der Erstellung habe ich mich an der Microsoft Doku https://docs.microsoft.com/de-de/dot...-to-com#sample orientiert.

Diese erstellten Assembly kann ich dann mittels regsvr32 registrieren und in der Registry tauchen auch die Schlüssel und Werte auf.

Nun möchte ich mir in Delphi die Sourcen generieren lassen, leider taucht die dll nicht "Komponente --> Komponente importieren... --> Typbibliothek" auf.

Dann habe ich mir gedacht, erstelle ich doch eine neue Instanz mittels
Delphi-Quellcode:
CreateComObject("hier eine tolle GUID")
.

Hier kommt leider die Fehlermeldung, dass die Klasse nicht registriert ist.

Hat es jemand von euch schon mal geschafft, eine .Net Core Assembly in Delphi aufzurufen???
Das Beispiel kann von mir aus auch Registration-Free (Side-By-Side) sein.

Danke

Der schöne Günther 31. Jan 2020 09:34

AW: Aufruf von .net Core 3.1 Assemblies
 
https://github.com/dotnet/samples/tr.../COMServerDemo
und
https://github.com/dotnet/core-setup...-activation.md

hast du gesehen, oder?


Ich hatte mit COM nie etwas am Hut, mir hat es immer gereicht einen C++/CLI-Wrapper um den .NET-Code zu schreiben und diese dann von Delphi aus aufzurufen. Mit .Net Core sollte das weiterhin gehen.

mkinzler 31. Jan 2020 09:40

AW: Aufruf von .net Core 3.1 Assemblies
 
https://www.atozed.com/crosstalk/
https://hydra.remobjects.com/hydra/why.aspx
https://sourceforge.net/projects/dot...raryfordelphi/

Der schöne Günther 31. Jan 2020 09:44

AW: Aufruf von .net Core 3.1 Assemblies
 
Zitat:

Zitat von mkinzler (Beitrag 1456388)
(Links)

Protipp:

Zitat:

Zitat von Sergej_Molotov (Beitrag 1456383)
(nicht .Net Framework)


mkinzler 31. Jan 2020 09:51

AW: Aufruf von .net Core 3.1 Assemblies
 
.Net Core ist eigentlich auch nur .Net. Die Lösungen sollten eigentlich auch mit der Core-Variante funktionieren.

Sergej_Molotov 31. Jan 2020 09:58

AW: Aufruf von .net Core 3.1 Assemblies
 
ja, die beiden Links habe ich gesehen und auch gelesen.

Bisher haben wir bei uns ein .Net Framework 4.6.x Assemblies im Einsatz, die wir Side-By-Side ausliefern. TLB's können generiert und wunderbar in Delphi verwendet werden.

Code:
mt -managedassemblyname:"MyCSharpAssembly.dll" -nodependency -out:"MyCSharpAssembly.manifest"
tlbexp "MyCSharpAssembly.dll" /out:"MyCSharpAssembly.tlb"
tlibimp.exe -P "MyCSharpAssembly.tlb" -D"blub"
Da ja das Framework nicht mehr großartig weiter entwickelt wird (siehe https://www.microsoft.com/de-de/tech...sst-net-5.aspx) wollte ich mal schauen, ob man ohne fremde Frameworks (hydra und co) unsere Projekte nach .NET-Core portieren kann.

Wie gesagt, wenn jemand sonst von euch ein Beispiel hat oder kennt, wäre ich dankbar. Vielleicht habe ich ja auch nur ein dummen Fehler gemacht.

Zitat:

Die Lösungen sollten eigentlich auch mit der Core-Variante funktionieren
Ich bin mir da nicht so ganz sicher, dass der Core mit dem Framework gleichzusetzen ist. Die Com-Unterstützung ist auch erst seit 3.0 enthalten.

Zitat:

Anders als im .NET Framework wird in .NET Core die Erstellung einer COM-Typbibliothek (TLB) aus einer .NET Core-Assembly nicht unterstützt. Die Anweisung besagt, dass Sie manuell eine IDL-Datei oder einen C++ Header für die nativen Deklarationen Ihrer Schnittstellen schreiben müssen.

4dk2 31. Jan 2020 10:19

AW: Aufruf von .net Core 3.1 Assemblies
 
Also bei mir klappt es auch nicht,
habs mal mit dem Beispiel von ms probiert.
in der Registry ist die Dll vorhanden, auch mit meiner verwendeten GUID, aber bei delphi sagt er mir Exception:"Klasse nicht registriert"


Delphi-Quellcode:
uses
  System.SysUtils,
  ActiveX,
  System.Win.Comobj;

var s:string;
var guid:TGUID;

begin
  try
    s:='{05799DB1-3A1F-4D9A-82EF-2B06FBF774CF}';
    guid:=TGUID.Create(s);


    OleInitialize(nil);
//    CoInitialize();
    CreateComObject(guid);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

und ich denke mal du hast die richtige dll regstriert oder?
es werden zwei erstellt:

Projekname.dll (.netcore)
Projekname.comhost.dll (comserver loader, enthält CoRegisterServer usw)

Projekname.comhost.dll muss mit regsrv registiert werden, aber vermute mal, das du das so gemacht hast

Sergej_Molotov 31. Jan 2020 10:22

AW: Aufruf von .net Core 3.1 Assemblies
 
Yepp, habe die Projekname.comhost.dll registriert.

4dk2 31. Jan 2020 10:28

AW: Aufruf von .net Core 3.1 Assemblies
 
Und der Kontrollversuch bei mir mit ner .NetCore als Client zur Com funktioniert.
ABER, wenn ich meinen .netCoreClient auf x86 erstelle, klappts net mehr!
ich glaub daher weht der wind auch bei Delphi!

FEHLER .netCore:
System.Runtime.InteropServices.COMException: "Retrieving the COM class factory for component with CLSID {05799DB1-3A1F-4D9A-82EF-2B06FBF774CF} failed due to the following error:
80040154 Klasse nicht registriert (0x80040154 (REGDB_E_CLASSNOTREG))."

Klingt ja so wie bei Delphi!

4dk2 31. Jan 2020 10:31

AW: Aufruf von .net Core 3.1 Assemblies
 
Jap, die ComAssembly mit ziel x86 erstellen, und wichtig neu registrieren danach!
Danach läuft es in Delphi bei mir. (zumindest das CreateComObject(guid) XD)

Sergej_Molotov 31. Jan 2020 10:37

AW: Aufruf von .net Core 3.1 Assemblies
 
Der Hinweis mit x86 in C# hat auch bei mir geholfen. Jetzt versuche ich gerade eine Funktion meiner erzeugten Klasse aufzurufen, aber das geht noch nicht. Versuche es aber weiter...

Variante referenziert kein Automatisierungsobjekt

Sergej_Molotov 31. Jan 2020 12:16

AW: Aufruf von .net Core 3.1 Assemblies
 
Der Aufruf der Funktion geling jetzt auch. Ich habe über "Komponente --> Komponente importieren --> .Net-Assembly importieren" die OHNE comhost.dll importiert und konnte dann die Funktionen aufrufen.

Danke 4dk2 und allen anderen

Sergej_Molotov 31. Jan 2020 14:08

AW: Aufruf von .net Core 3.1 Assemblies
 
Wer eine TLB-Datei haben möchte, kann diese wie folgt berechnen:
Code:
tlbexp Test.dll /asmpath:"C:\Windows\Microsoft.NET\Framework\v4.0.30319"
tlibimp -P Test.tlb -Pt+

Abudinka 16. Feb 2022 07:31

AW: Aufruf von .net Core 3.1 Assemblies
 
Zitat:

Zitat von Sergej_Molotov (Beitrag 1456422)
Der Aufruf der Funktion geling jetzt auch. Ich habe über "Komponente --> Komponente importieren --> .Net-Assembly importieren" die OHNE comhost.dll importiert und konnte dann die Funktionen aufrufen.

Danke 4dk2 und allen anderen

Hab den selben weg "durch gemacht" allerdings wird mein Interface falsch implementiert, bzw. automatisch ein zusätzliches erstellt. Auch taucht auch nach der registrierung weder mein eigener comhost noch die comserverdemo in der delphi import list auf

c#:

Code:
  [ComVisible(true)]
    [Guid("E7637EE9-EDBC-4BA4-984D-B87A2CA6B97E")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IWFNet5
    {
        IntPtr DoSomething();
    }
    [ComVisible(true)]
    [Guid("E04FA7A1-481D-42F4-A14C-D7CA94017B2B")]
    public class WFNet5 : IWFNet5
    { 
        public WFNet5()
        {
        }

        public IntPtr DoSomething()
        {
        }
    }
woraus delphi zwar das interface IWFNet5 erstellt aber zusätzlich ein leeres _WFNet5 interface erstellt von dem die WFNet5 implementierung erbt, die dann die Funktion DoSomething nicht implementiert

hat da jemand einen tipp? -- es fehlt bei der Klassendefinition das Attribut
[ClassInterface(ClassInterfaceType.None)]


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz