我正在尝试使用
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 一样,它会占用更多资源并导致滞后