如果项目和 C# dll 在不同的目录下C++如何正确使用 mono_add_internal_call

How to use mono_add_internal_call properly if C++ project and C# dll are under different directory

提问人:LoneliNerd 提问时间:11/14/2023 最后编辑:LoneliNerd 更新时间:11/14/2023 访问量:33

问:

我有一个 C++ 项目,想要在 C# dll 中调用函数,因此我遵循了单体文档,并在 C++ 项目中拥有以下代码:

static MonoString* Sample()
{
    return mono_string_new(mono_domain_get(), "Hello CPP");
}

int main()
{
    domain = mono_jit_init("MyGame");

    MonoAssembly* assembly = mono_domain_assembly_open(domain, unity_main_dll_path);
    image = mono_assembly_get_image(assembly);

    mono_add_internal_call("Game.Call2Cpp::TestCall", Sample);

    return 0;
}

然后,我在 C# 中有这段代码,它实际上是一个 unity 项目:

namespace Game
{
    public class Call2Cpp : MonoBehaviour
    {
        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        static extern void TestCall();

        void Update()
        {
            if(Input.GetKeyDown(KeyCode.T))
            {
                TestCall();
            }
        }
    }
}

当我测试它时,我在 unity 运行时按“T”,它发生了错误:

MissingMethodException:  assembly:<unknown assembly> type:<unknown type> member:(null)
Game.Call2Cpp.Update () (at Assets/Scripts/Game/Multiplayer/Call2Cpp.cs:26)

我想知道 C++ 项目和 Unity 项目可能在不同的目录下的原因:

C++ 项目路径是 /Project/Server/Main.cpp,Unity 项目在 /Project/Client 下,并且由于某些原因我无法将它们移动到同一目录下。但无论如何,我不确定这是否是真正的原因。

所以我的问题是:

  1. 是不是路径不同导致出现这个问题,在这种情况下如何正确使用“mono_add_internal_call”?

  2. 在这种情况下,是否有其他方法可以从 C++ 通过 mono 调用 C# 代码?

  3. 我想知道的是,我一开始对这个 mono api 的使用是不正确的,但是在谷歌上进行了相当多的搜索工作后,发现其他人就像我所做的那样调用了mono_add_internal_call,然后工作就完成了,似乎之前和之后没有更多的额外代码。

  4. 然后我删除了 Call2Cpp.cs 上的 Monobehavior,因为当我尝试从 C++ 调用 C# 时找不到该类,并且我从另一个脚本调用 Call2Cpp.TestCall(),但发生了同样的错误。

C# C++ unity-游戏引擎 mono

评论

0赞 BugFinder 11/14/2023
那里有很多信息,你需要用正确的.net来构建它,你把它放在正确的文件夹中,尽管从来没有做过,前段时间有一个问题,我尝试了那个家伙做了什么,更正了版本,它起作用了。所以这很简单。
0赞 derHugo 11/14/2023
而不是不应该是吗?例如,参见 Native PluginsLow-level native plug-in interface ...afaik Unity 仅用于与原生 Unity Core 的钩子(因为基本上整个 c# API 只是引擎顶部的一个更用户友好的层)MethodImplAttribute[DllImport ("PluginName")]MethodImplAttribute

答: 暂无答案