让Unity可以释放DllImport的引用的dll

语法

在Unity使用DllImport,导入C++写的dll后,如果Unity Editor停止运行,导入的dll还被引用住,如果要修改dll,就必须关闭Unity,导致了调试很耗时。

追踪DllImport的代码,可以发现,对应函数在第一次调用时,走到mono的函数如下:

graph TD
    A[mono_lookup_pinvoke_call] --> B[cached_module_]
    B --> C[cached_module_load]
    C --> D[mono_dl_open]
    D -->E[LoadLibrary]

本质上就是调用Windows的LoadLibrary加载dll,然后调用GetProcAddress(函数名)获取对应函数的地址。理论上讲使用FreeLibrary(hmodule)可以把dll释放掉。为了验证想法,单独作了下小测试:

// 新建一个MathDll工程,并生成dll,代码如下:

extern "C"
{
  __declspec(dllexport) int DoAdd(int a, int b)
  {
    return a + b;
  }
}

// 再新建一个DllLoadUnload win32 console工程,代码如下:

#include <iostream>
#include <windows.h>

extern "C"
{
  typedef int (func)(int, int);
}

int main()
{
  while (1)
  {
    HMODULE hmodule = ::LoadLibrary("MathDll.dll");
    func* add = (func*)::GetProcAddress(hmodule, "DoAdd");
    std::cout << "add result = " << (*add)(1, 2) << std::endl;
    ::FreeLibrary(hmodule);
    system("pause");
  }
  return 0;
}

// 代码结束

在system("pause")时,先不要结束程序,会发现MathDll.dll可以删除。

把FreeLibrary注释掉,再编译一次,会发现在system("pause")时,删除MathDll.dll会提示dll被占用。

因此,验证通过,可以使用FreeLibrary来释放引用住的dll。

所以,可以mono加个接口,释放指定名字的dll,然后在Unity中加个接口来调用就可以,完。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,412评论 0 27
  • 原文地址: https://blog.csdn.net/qianchenglenger/article/detai...
    Caiaolun阅读 5,345评论 0 1
  • 转自长亭知乎专栏,实习时小姐姐的约稿,已经不在那边了所以版权不归我哈 笔者一直自认玩过不少游戏,无奈水平太菜,日常...
    hyrathon阅读 5,806评论 0 0
  • 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个...
    CrixalisAs阅读 6,380评论 1 7
  • 三八节又快到了。 还记得小时候对这个节又爱又恨的心情,爱它是有假期有祝福,恨它是实在不想当“妇女”。 现在,忽然发...
    明明似我阅读 4,218评论 3 5

友情链接更多精彩内容