Unity调用dll踩坑记

这篇具有很好参考价值的文章主要介绍了Unity调用dll踩坑记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

请用写一段代码,让unity无声无息的崩溃。
你说这怕是有点难哦,谁会这么不幸呢?不幸的是,我幸运的成为了那个不幸的人。

unity里面调用dll的方式是使用 DllImport ,比如有一个 Hello.dll,里面有一个 char* Greet(char* name) 的方法。将 Hello.dll 放入Unity的Plugins目录下,如果没有就自己建一个,然后通过下面的代码导入dll。

[DllImport("Hello.dll")]
private extern static IntPtr Greet(byte[] name);

也可以通过 EntryPoint 来指定函数入口。

[DllImport("Hello.dll", EntryPoint = "Greet")]

嗯,一切正常。
刚开始确实很正常,直到后来有一次升级了dll,替换了部分依赖的dll,然后就GG了,dll返回的内存和预想不同,某些字节顺序被打乱了。

unity 导入dll4.0,unity,unity,dll

WTF??不是说编程没有玄学吗?

刚开始我们认为是dll本身的问题,但是经过测试发现dll本身没有问题,直接通过C#或者python调用dll,返回的内存都是正确的。这可就见鬼了,难道只有unity有问题?终究还是unity抗下了所有。

但有个奇怪的地方,只有在编辑器里运行有问题,打包出来运行也没问题。经过缜密的思考,反复实验,我们猜测是debug库release库的问题,也就是说编辑模式下得使用debug库才行。经过实验,果然如此,换成debug版本的dll,在编辑模式下也能得到正确的结果。

于是我们踩出第一个坑,某些dll在unity编辑模式下调用不正确,得换成debug版本的dll。注意,并不是所有的dll都会如此,而且大部分dll都不必如此,只有我们手动编译的FreeImage库出现了这个问题。

满心欢喜以为问题完美解决,可惜还是太年轻,福兮祸所伏,没想到还是个连环坑。使用debug库之后,调用dll时,unity直接崩溃,而且是悄无声息的,就这么退出了,不带走一片云彩。

unity 导入dll4.0,unity,unity,dll

观察 C:\Users\用户名\AppData\Local\Unity\Editor 下的 Editor.log,可以看到unity编辑器退出之前的日志。文件中记录了dll调用之后的日志,这也就是说调用dll本身并没有出错。

经过单步调试,发现是崩溃在释放内存的地方。

在VS中按F5启动调试,回到unity编辑器选择同意调试即可单步调试unity脚本。

IntPtr data = Greet(...);
Marshal.FreeHGlobal(data);

在编辑模式下,调用 Marshal.FreeHGlobal 释放dll分配的内存就会异常退出,当然,打包出来运行是正常的。

FreeHGlobal的文档链接:点击跳转。

debug模式的dll该如何释放内存,目前还没有解决,但是如果不释放,确实会导致内存占用上涨,但好歹在编辑模式下,暂且放过它吧。果然程序都是靠bug运行的。文章来源地址https://www.toymoban.com/news/detail-853877.html

unity 导入dll4.0,unity,unity,dll

到了这里,关于Unity调用dll踩坑记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity——在C#中调用C++动态链接库(DLL)

    1、新建C++空项目 打开VS,新建一个C++空项目,自命名项目名称与位置。 2、配置项目属性为动态链接库 右键项目,点击属性,打开项目属性页,将常规中的配置类型改为动态库(.dll)。  3、添加.h头文件 右键头文件,点击添加—新建项,选择头文件.h,命名为DllForUnity.h,点击

    2024年02月10日
    浏览(29)
  • 使用Rider C# Dll工程和Unity工程互相调用、断点方法

    创建C# Dll工程,生成C#工程Dll 创建Unity工程 Unity调用C#工程的代码 C#工程调用Unity工程的代码 断点方法 创建工程 选这个,注意UnityEngineDll这个选项,要选你目标unity版本的Dll 生成Dll 右键工程 简单,能看到这篇文章的都是优秀的同学,所以,此步略过 下面这两个复制到unity工程

    2024年01月20日
    浏览(45)
  • Unity调用微软SpeechLib.Dll的C#类实现语音合成功能

    using System.Collections; using System.Collections.Generic; using UnityEngine; using SpeechLib; public class Speech : MonoBehaviour { // Start is called before the first frame update void Start() { } 将Interop.SpeechLib.dll文件导入Unity,然后把上面的脚本挂载到游戏对象上就能测试语音合成的效果了。 经测试 调用v.Speak这个方

    2024年02月13日
    浏览(34)
  • Flutter踩坑记之二

    今天又踩了两个坑 一个新项目,前段时间一直是在Android环境下测试,这几天准备发布ios的测试版本,结果遇到了两个坑 坑一、pod install时,下载插件错误 提示连接github.com的443端口失败 由于MacOs通过代理服务器上网,网页能正常访问到资源,但git下载的时候一直失败,切换到

    2024年01月25日
    浏览(27)
  • 安装 opendr 踩坑记

    复现早期的优化算法需要用到opendr,踩坑一天记录!!! python 3.8.15 numpy=1.23.0 mayavi=4.8.1 chumpy=0.70 cpython=3.0.0 安装opendr命令1:安装的版本是0.78 截止目前我还找不到答案! 安装opendr命令2 参考链接中的手动安装,安装的是opendr版本是0.77 安装opendr命令3 报错依旧 我这个环境是重

    2024年02月14日
    浏览(32)
  • Cypress 踩坑记 - DOM 遮挡

    Cypress 是一个非常流行的测试工具,然而实际使用过程中发现一些问题,这里做些记录。 在 Cypress 下 click 是非常常用的指令,然而在一些特殊场景下 click 并不能如想象中那般正常工作。 比如现在有一个弹窗,我们需要测试在点击遮罩层时是否可以正常关闭弹窗。 测试代码比

    2024年02月05日
    浏览(24)
  • AWS云服务踩坑记

    之前写过一篇阿里云的踩坑吐槽文:踩坑记:C#访问阿里云的API小结,阿里云的文档有待改善 最近2年开始使用AWS云服务,也记录一下跟阿里云不一样的踩坑历史吧。 这个机制没有认真的去研究, 比如CPU积分,大意就是 aws允许你超出标准,使用额外的CPU性能,但是这个超额时

    2024年02月09日
    浏览(27)
  • vscode运行C语言踩坑记

    本文对Vscode运行C语言代码报错进行整理,重点是头文件路径正确仍然报错找不到路径的解决办法。 需要注意,VScode本身不具有编译运行代码能力,所以需要先安装对应的编译环境并下载插件。已安装编译器软件的可以参考如下连接进行配置: Visual Studio Code(VSCode)调用Dev C编译

    2024年01月16日
    浏览(29)
  • 【uniapp踩坑记】——微信小程序转发&保存图片

    关于微信小程序转发保存图片 已经好多年没写博客了,最近使用在用uniapp开发一个移动版管理后台,记录下自己踩过的一些坑 微信小程序图片转发保存,依赖小程序的转发api—— wx.showShareImageMenu(Object object) 通过调用这个api能触发如下弹窗 ![在这里插入图片描述] (https://img

    2024年04月15日
    浏览(23)
  • 微信小程序获取获取 URL Link 踩坑记

    一、获取 URL Link 文档地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html   特别注意 ⬇️ ⬇️ ⬇️ 如图,仅access_token为url拼接入参 二、获取不限制的小程序码 文档地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimi

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包