强烈建议阅读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);