C DLL이 다음 처럼 2개의 함수를 노출한다고 할 때
DLLFunction int addint(int n1, int n2)
{
return n1 + n2;
}
DLLFunction int addchar(char* s1, char* s2, char* added)
{
sprintf(added, "%s%s", s1, s2);
return strlen(added);
}
C#에서는 다음 코드와 같이 사용 가능하다.
여기서 요점은 c data type과 C# data type을 매칭하는것인데. 이 때 메모리를 할당하여 포인터를 전달하거나 struct 데이터를 전달할 경우 Marsal 클래스를 사용해야 한다. (참조 : http://rainiac.com/dev/index.php/c-interop-c%EA%B3%BC-c-api%EC%9D%98-%EC%83%81%ED%98%B8%EC%9A%B4%EC%98%81/)
using System.Runtime.InteropServices;
// 빈 페이지 항목 템플릿에 대한 설명은 http://go.microsoft.com/fwlink/?LinkId=234238에 나와 있습니다.
namespace DllTestApp1
{
class Dll
{
[DllImport("Win32Project1.dll")]
public static extern int addint(int n1, int n2);
[DllImport("Win32Project1.dll")]
public static extern int addchar(StringBuilder s1, StringBuilder s2, StringBuilder s3);
}
/// <summary>
/// 자체에서 사용하거나 프레임 내에서 탐색할 수 있는 빈 페이지입니다.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
/// <summary>
/// 이 페이지가 프레임에 표시되려고 할 때 호출됩니다.
/// </summary>
/// <param name="e">페이지에 도달한 방법을 설명하는 이벤트 데이터입니다. Parameter
/// 속성은 일반적으로 페이지를 구성하는 데 사용됩니다.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
// add int
private void Button_Click_1(object sender, RoutedEventArgs e)
{
int sum = Dll.addint((int)10, (int)200);
}
// add char
private void Button_Click_2(object sender, RoutedEventArgs e)
{
StringBuilder aa = new StringBuilder("aa");
StringBuilder bb = new StringBuilder("bb");
StringBuilder added = new StringBuilder();
Dll.addchar(aa, bb, added);
}
}
}