Delphi 및 C# 상호 운용 Hydra

3040 단어 DelphiC#
Hydra for Delphi\Samples\Delphi WPF에서 Delphi 마스터 + C# WPF 라이브러리의 모드를 참조하십시오.
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비트 시스템이 언급되지 않았기 때문에 완전히 호환되는지 아닌지는 알 수 없다.

좋은 웹페이지 즐겨찾기