在gdnative里卸载自身dll,而不用重启godot
godot的gdnative库是以dll的动态链接库的形式载入到主程序的.如果是以gdnative写的插件,一但打开了godot成功载入了dll 那么,就无法重新编译dll的代码,直到关闭godot,dll从内存卸载才可以重编译.
我也没有在gdnative的相关代码里找到可以用脚本卸载dll的方法.于是百度了一下.找到一个可以用dll卸载自身的方法.也就是这个卸载的函数是在dll自己的代码里.
HMODULE hmSelfG=NULL; //==== 卸载dll自身 ==================================== DWORD UnloadSelf(PVOID param) { FreeLibraryAndExitThread(hmSelfG, 0); return 0; } void UnloadSelfEX() { CloseHandle( CreateThread(NULL, 0, UnloadSelf, NULL, 0, NULL) ); } BOOL DllMain(HINSTANCE hinstDLL, DWORD state, PVOID lpvReserved) { switch (state) { case DLL_PROCESS_ATTACH: { hmSelfG = (HMODULE)hinstDLL; //当dll加载到godot时,获取这个 dll句柄 break; } } return TRUE; }
当dll载入时 自动运行DllMain,并把自身的句柄保存到hmSelfG全局变量,当要卸载自己时,只要运行了UnloadSelfEX()函数(这个函数可以绑定到一个按键上) ,就可以把自己卸载了.当重编译代码后,按下play 就能重载入这个新的dll.
这个问题之前在论坛上提了,但没人回答,最终还是自己解决了
https://godotdevelopers.org/forum/discussion/20325/how-to-free-the-dynamic-library-that-has-been-loaded-into-the-gdnative
暂无关于此日志的评论。