Mono 默认程序集路径错误 C++

问题描述 投票:0回答:1

我正在尝试使用

mono_domain_assembly_open
从单机游戏加载程序集,但是我必须设置程序集的完整路径才能加载,这在解析类、方法和字段时会导致相当大的滞后。

在我开发的其他游戏中,无需在

mono_domain_assembly_open
中设置完整路径,我就能够解决问题,没有任何问题或延迟。

为什么我必须在这个游戏中手动设置路径以及如何更改它?

我使用的域名是我从

mono_get_root_domain

获得的根域名

我不完全理解 mono 内部是如何工作的,因为我只是使用用 mono 编译的应用程序。

完整代码:

void Mono::Attach()
{
    domain = mono_get_root_domain();
    mono_thread_attach(domain);
}

void Mono::Initialize()
{
    Memory::Initialize(); //for resolving exports
    API::Initialize(); //also for resolving exports

    Mono::Attach();
}

void Class::Methods()
{
    void* iter = nullptr;
    MonoMethod* method;
    while (method = mono_class_get_methods(this, &iter))
    {
        std::cout << mono_method_full_name(method, 1) << "\n";
    }
}

std::string GetPath(const char* Asm) 
{
    //gather full path to assembly
    return "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Green Hell\\GH_Data\\Managed\\" + std::string(Asm) + ".dll";
}

Assembly* Assembly::Resolve(const char* Name)
{
    //need to pass full path to get the assembly
    //if i dont it will return a nullptr with assembly not found exception
    return (Assembly*)mono_domain_assembly_open(Mono::domain, API::GetPath(Name).c_str());
}

Class* Class::Resolve(const char* Asm, const char* Namespace, const char* Klass)
{
    return (Class*)mono_class_from_name(Assembly::Resolve(Asm)->GetImage(), Namespace, Klass);
}

DWORD WINAPI MainThread(LPVOID lpReserved)
{
    Mono::Initialize();
    Class::Resolve("Assembly-CSharp", "", "Player")->Methods();

    return TRUE;
}

我已经尝试过使用

mono_set_dirs
mono_set_assemblies_path
,甚至使用完整路径实例也无济于事。就像我必须将一条大路径传递给 mono_domain_ assembly_open 一样,它会占用更多资源并导致滞后

c# c++ unity-game-engine mono monogame
1个回答
0
投票

我不知道你是否正在处理unity,但如果你是,你可能需要加载dll“mono-2.0-bdwgc.dll”而不是“mono.dll”,因为它包含unity下所需的功能。下面是我的意思的一个例子。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.