logo MSJO.kr

C# Interop with Delphi

2021-08-15
MsJ

C# Interop with C/C++ 주제로 Native DLL을 C#에서 호출하여 사용하는 예1를 살펴보았는데 이번 주제는 Delphi DLL 파일을 C#에서 사용하는 예제를 작성해보았다. 모두 64bit로 빌드하였고 사용한 .NET 버전은 5.0이다. 예제에 사용한 소스 중 일부는 programmerall.com2에서 참고하였다.

Delphi (TestLib.dll)
library TestLib;

uses
  System.SysUtils, System.Classes, System.AnsiStrings;

{$R *.res}

function GetResultP(inputString: PAnsiChar): PAnsiChar; stdcall; export;
var
  pstr: PAnsiChar;
begin
  pstr := PAnsiChar(AnsiString(' : 가나닭'));
  Result := System.AnsiStrings.StrCat(inputString, pstr);
end;

function GetResult(inputStirng: PChar): PChar; stdcall; export;
var
  str: PChar;
begin
  str := PChar(' : 마바삵');
  Result := StrCat(inputStirng, str);
end;

exports GetResultP, GetResult;

begin
end.
C# (Program.cs)
using System;
using System.Runtime.InteropServices;

namespace ConsoleApp
{
    internal static class Program
    {
        private static void Main()
        {
            Console.WriteLine(ImportTest.GetResultP("Hello"));

            Console.WriteLine(ImportTest.GetResultS("World"));
        }
    }

    public static class ImportTest
    {
        [DllImport(@"TestLib.dll", EntryPoint = "GetResultP", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        [return: MarshalAs(UnmanagedType.AnsiBStr)]
        public static extern string GetResultP([MarshalAs(UnmanagedType.AnsiBStr)] string inputString);

        [DllImport(@"TestLib.dll", EntryPoint = "GetResult", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        [return: MarshalAs(UnmanagedType.SysInt)]
        private static extern IntPtr GetResult([MarshalAs(UnmanagedType.LPWStr)] string inputString);

        public static string GetResultS(string str)
        {
            return Marshal.PtrToStringAuto(GetResult(str));
        }
    }
}
Reference
  1. MSJO.kr, “C# Interop with C/C++”
  2. Programmer All, “C # call Delphi DLL”

Prεv(Θld)   Nεxt(Nεw)
Content RustLang.kr
Search     RSS Feed     BY-NC-ND