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:
[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);
Außerdem, woher hast du denn das mit dem UnmanagedType.U1?
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:
ITest = interface
['{D032F796-167D-4B0D-851D-2AEEA226646A}']
function GetTest : Integer; safecall;
procedure SetTest(value : integer); safecall;
end;
Dann würde das Interface in C# so aussehen:
Code:
[ComImport,
Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest
{
int Test { get; set; }
}
Wenn du es so lassen willst wie jetzt, würde man es in C# trotzdem als property mappen:
Code:
[ComImport,
Guid("D032F796-167D-4B0D-851D-2AEEA226646A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest
{
int Test
{
[MethodImplAttribute(MethodImplOptions.PreserveSig)]
get;
[MethodImplAttribute(MethodImplOptions.PreserveSig)]
set;
}
}
btw, du hast da EINIGE Dinge eingebaut, die da überhaupt nicht hingehören:
- Deine exportierte Funktion hat keine String, warum also Unicode im DllImport?
- stdcall ist die nromale CallingConvention, muss da also nicht stehen.
- Deine Interface-GUIDs waren unterschiedlich, wofür sind den die GUIDs wohl da, wenn nicht um das Interface in beiden System zu identifizieren?