Linuxの場合、例は次のようになります。
1)次の内容のC
ファイルを作成します。libtest.c
#include <stdio.h>
void print(const char *message)
{
printf("%s\\n", message);
}
これは、printf の単純な疑似ラッパーです。ただしC
、呼び出したいライブラリ内の関数を表します。関数がある場合は、名前のマングルを避けるためC++
に extern を入れることを忘れないでください。C
2)C#
ファイルを作成する
using System;
using System.Runtime.InteropServices;
public class Tester
{
[DllImport("libtest.so", EntryPoint="print")]
static extern void print(string message);
public static void Main(string[] args)
{
print("Hello World C# => C++");
}
}
3) ライブラリ libtest.so が「/usr/lib」などの標準ライブラリ パスにない限り、System.DllNotFoundException が表示される可能性があります。これを修正するには、libtest.so を /usr/lib に移動するか、またはさらに良いことに、CWD をライブラリ パスに追加するだけです。export LD_LIBRARY_PATH=pwd
クレジットはこちらから
編集
Windowsの場合、それほど違いはありません。ここから例を挙げると、*.cpp
ファイルにメソッドを次extern "C"
のようなもので囲むだけです
extern "C"
{
//Note: must use __declspec(dllexport) to make (export) methods as 'public'
__declspec(dllexport) void DoSomethingInC(unsigned short int ExampleParam, unsigned char AnotherExampleParam)
{
printf("You called method DoSomethingInC(), You passed in %d and %c\n\r", ExampleParam, AnotherExampleParam);
}
}//End 'extern "C"' to prevent name mangling
次に、コンパイルし、C# ファイルで次のようにします。
[DllImport("C_DLL_with_Csharp.dll", EntryPoint="DoSomethingInC")]
public static extern void DoSomethingInC(ushort ExampleParam, char AnotherExampleParam);
そして、それを使用してください:
using System;
using System.Runtime.InteropServices;
public class Tester
{
[DllImport("C_DLL_with_Csharp.dll", EntryPoint="DoSomethingInC")]
public static extern void DoSomethingInC(ushort ExampleParam, char AnotherExampleParam);
public static void Main(string[] args)
{
ushort var1 = 2;
char var2 = '';
DoSomethingInC(var1, var2);
}
}