強烈建議閱讀Mono官方文檔
有mono庫提供的API,這個過程非常簡單,通過mono在C++中注冊函數,然后在C#中聲明和調用這些函數
1、在C++中注冊Internal Call:
C++代碼中定義一個函數
static void CppFunc()
{std::cout << "這是在C++中實現的函數\n";
}
這是在C++中實際的函數實現。注意static
并非必須,僅僅因為我想讓他只在當前編譯單元可見而已。
注冊Internal call
mono_add_internal_call("Hello::CppFunction", CppFunc);
這一行代碼將C函數 sample
注冊為內部調用(Internal Call)
,使得它可以從C#中直接調用。Hello::CppFunction
是注冊的名稱,表示在C#中調用這個函數時使用的名稱。CppFunc
則是實際的C函數名稱。
注意,需要在特定的App Domain
中注冊Internal Call。當調用mono_domain_set
來切換到一個新的App Domain時,通常原來的App Domain的所有注冊信息都不再有效,因此你需要重新注冊Internal Call。
2、在C#中聲明Internal Call:
using System;
using System.Runtime.CompilerServices; // 必要頭文件class Hello
{public Hello(){CppFunction();}[MethodImplAttribute(MethodImplOptions.InternalCall)]extern static void CppFunction();
}
在C#中,使用 [MethodImpl(MethodImplOptions.InternalCall)]
特性來聲明一個內部調用。這告訴編譯器,實際的方法實現是在運行時的C++代碼中。
如果C#中,類還處于一個命名空間中,那么注冊的時候必須給一個完整的路徑,這個路徑比較奇怪,例如這種情況
namespace Happy
{class Hello {public Hello(){CppFunction();}[MethodImplAttribute(MethodImplOptions.InternalCall)]extern static void CppFunction();}
}
注冊internal call 應該:
mono_add_internal_call("Happy.Hello::CppFunction", CppFunc);