![]() |
AW: Delphi DLL Schnittstelle zu C#
Habe alle mir bekannten Möglichkeiten ausgeschöpft
komme leider zu keinem Ergebnis. Vielleicht hilft dir dieser Beitrag weiter. ![]() Letzter Beitrag. Sorry :cry: gruss |
AW: Delphi DLL Schnittstelle zu C#
Ohne mich mit der Problematik näher auseinander zu setzen:
Sollte GetTestClass nicht "ITest" liefern statt "TTest"? Schließlich kennt nur die DLL die konkrete Klasse. |
AW: Delphi DLL Schnittstelle zu C#
Danke hab ich probiert. Dann weiss ich halt einfach nicht was ich damit in C# anfangen soll. Ich kann ja kein Objekt davon erzeugen oder so...
Ich wäre sehr froh, wenn du dir den C# Code noch einmal angucken könntest...Ich habe irgendwie immer mehr das Gefühl, dass nicht allzu viel von dem Sinn ergibt:oops::lol: Herzlichen Dank an EWeiss für seine Bemühungen. |
AW: Delphi DLL Schnittstelle zu C#
Man sollte aufpassen, wenn man mit Delphi sdtcall benutzt.
Delphi übergibt rückgabewerte anders, als es unter Windows eigenetlich sein sollte. Es ist deshalb angebracht diese als out-Parameter zurückzugeben:
Delphi-Quellcode:
procedure GetTestClass(out value : ITest); stdcall; export;
begin value := TTest.Create; value.SetTest(5); end;
Code:
Außerdem, woher hast du denn das mit dem UnmanagedType.U1?
[DllImport("Schnittstellen_1", EntryPoint = "GetTestClass", SetLastError = true)]
public static extern void GetTest(out ITest value); public static void Main() { ITest test; GetTest(out test); Debug.Assert(test.Test == 5); test.Test = 2; Debug.Assert(test.Test == 2); Ein Integer in Delphi ist binär kompatibel mit einem Int32 in .Net, den man in C# auch "int" nennen kann. Wenn du in Delphi die Interface-methoden als safecall markierst, wird sie Delphi für dich so ummodeln, dass sie dem HResult-Pattern aus der COM-Welt passen:
Delphi-Quellcode:
Dann würde das Interface in C# so aussehen:
ITest = interface
['{D032F796-167D-4B0D-851D-2AEEA226646A}'] function GetTest : Integer; safecall; procedure SetTest(value : integer); safecall; end;
Code:
Wenn du es so lassen willst wie jetzt, würde man es in C# trotzdem als property mappen:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest { int Test { get; set; } }
Code:
btw, du hast da EINIGE Dinge eingebaut, die da überhaupt nicht hingehören:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest { int Test { [MethodImplAttribute(MethodImplOptions.PreserveSig)] get; [MethodImplAttribute(MethodImplOptions.PreserveSig)] set; } }
|
AW: Delphi DLL Schnittstelle zu C#
Wow danke!!!!:lol::lol::thumb::corky::chat:
Du bist genial:thumb: Funzt perfekt !Da verfliegt doch der Ärger über meine blöden Fehler schnell:roll::wall: |
AW: Delphi DLL Schnittstelle zu C#
Zitat:
@Elvis :thumb: War dann doch der richtige Beitrag den ich verlinkt habe. Na dann! Schön das es nun funktioniert. gruss |
AW: Delphi DLL Schnittstelle zu C#
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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