サポートを提供しない作成者による文書化されていないハックに頼るのではなく、文書化された方法でこれを行うことをお勧めします。例でやってみましょう:
namespace Publics {
public class Class1 {
public static void Run() {
// Stuff...
}
}
}
プロジェクトに新しい C++/CLI クラス ライブラリを追加します。ソリューションを右クリックし、[追加]、[新しいプロジェクト] の順にクリックします。[その他の言語] ノード、Visual C++、CLR を開き、[クラス ライブラリ] プロジェクト テンプレートを選択します。新しいプロジェクト、[プロパティ]、[共通プロパティ]、[フレームワークおよび参照] を右クリックし、[新しい参照の追加] ボタンをクリックします。[プロジェクト] タブから、メソッドをエクスポートする C# プロジェクトを選択します。
//TODO コメントで事前生成された空のクラスを削除し、次のようなコードを記述します。
extern "C" __declspec(dllexport)
void __stdcall Example()
{
Publics::Class1::Run();
}
ソリューションを構築します。DLL で dumpbin.exe /exports を実行して、Example 関数がエクスポートされたことを確認します。次のようなものが表示されます。
1 0 00001020 _Example@0 = _Example@0
名前と呼び出し規約以外にも、エクスポートされた関数を微調整するための選択肢がたくさんあります。静的メソッドの代わりにインスタンス メソッドをエクスポートする場合は、たとえば次のように関数を記述できます。
extern "C" __declspec(dllexport)
void __stdcall Example()
{
Publics::Class1^ obj = gcnew Publics::Class1;
obj->Run();
}
これを複雑にするには、C++/CLI 言語にある程度精通している必要があります。大事なことを言い忘れましたが、Giesecke の IL リライタを機能させようとした最初の試みで何が問題だったのかを知ることもできます。それ以外の場合は、C++/CLI コンパイラがマネージ メソッドをエクスポートするために使用する手法とまったく同じ手法を使用します。