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));
}
}
}