Delphi 및 C# 상호 운용 Hydra
1. C#에 GUID를 사용할 인터페이스 생성
[Guid("8032a51c-5961-41f5-9582-c77d98ea4d93")]
public interface IVisualizerControl : IHYCrossPlatformInterface
{
bool BarsVisible { get; set; }
void Randomize();
void Sinus(Double aRange);
}
2. Delphi에서 이 라이브러리를 가져오고 메뉴 "Hydra\Import Interface from. NET Assemblies"에서 C#생성된 라이브러리를 선택하여 Delphi생성된 Interface를 직접 가져옵니다.
3. 일반적인 유형의 가져오기는 문제가 없다. 예를 들어 int(C#)-> Interger(Delphi), 더블(C#)-> 더블(Delphi), 스트링(C#)-> WideString(Delphi)
그러나 수조야 신마의 것은 안 되고 스스로 정의할 수밖에 없다. 연구를 통해 수조는 OleVariant(Delphi)->object(C#)를 사용할 수 있다는 것을 발견했다. 구체적인 방법은 다음과 같다.
예를 들면 이런 인터페이스가 있어요.
[Guid("8BF65985-CCED-4D0B-AFA0-101F51C7B9D7")]
public interface ITestControl : IHYCrossPlatformInterface
{
///
/// ( )
///
///
///
void InitDict(object keys, object values);
ITestControl = interface(IHYCrossPlatformInterface)
['{8bf65985-cced-4d0b-afa0-101f51c7b9d7}']
procedure InitDict(keys: OleVariant; values: OleVariant); safecall;
ㅋㅋ,봤지?직접 가져오면 const keys:OleVariant가 생성되므로 이 const는 반드시 제거해야 한다.그런 다음 Delphi 코드에서 이 C#에서 구현된 인터페이스를 호출합니다.
var
keys, values: OleVaraint;
N: Integer;
begin
N := 1;
keys := VarArrayCreate([0,N-1], varOleStr);
values := VarArrayCreate([0,N-1], varOleStr);
keys[0] := 'China';
keys[1] := 'English';
values[0] := ' ';
values[1] := ' ';
FTestImpl.InitDict(keys, values);//FTestImpl FTestImpl: ITestControl
end;
이상은 비일반적인 유형 변수를 전달했다.4.Delphi가 C#에 리셋 함수를 전달하는 등 더 특별한 수요가 있다면 어떻게 해야 합니까?
이것은 번거로운 일이다. 본인의 꾸준한 노력을 통해 마침내 하나의 방법을 찾았다. (전체 인터페이스를 시도해 보았는데 라이브러리에서 인터페이스 방법을 사용하면 틀릴 수 있다) 바로 전함수 바늘 주소이다.
//C#
///
///
///
///
void InitEvent(IntPtr callback);
//C#
public delegate void TestChangedHandler(int oldIdx, int newIdx);
//Delphi
procedure InitEvent(callback: Pointer); safecall;
type
//Delphi
PTestChanged = ^TTestChanged;
TTestChanged = procedure (oldIdx, newIdx: Integer); safecall;
//Delphi
procedure OnTestChanged(oldIdx, newIdx: Integer); safecall;
begin
ShowMessage(Format('Old:%d, New:%d', [oldIdx, newIdx]));
end;
// Delphi InitEvent :
var
PFun: PTestChanged;
begin
PFun := @OnTestChanged;
FTestImpl.InitEvent(PFun);//FTestImpl FTestImpl: ITestControl
end;
마지막으로 매개변수 유형의 사용에 주의해야 합니다.
WideString(Delphi) -> string(C#),string(C#) -> OleVariant(Delphi)
이상은 32비트나 64비트 시스템이 언급되지 않았기 때문에 완전히 호환되는지 아닌지는 알 수 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.