网站广告基本防护怎么做,西安网站建设罗鑫,网络推广工作,个人网站名称大全请用写一段代码#xff0c;让unity无声无息的崩溃。 你说这怕是有点难哦#xff0c;谁会这么不幸呢#xff1f;不幸的是#xff0c;我幸运的成为了那个不幸的人。
unity里面调用dll的方式是使用 DllImport #xff0c;比如有一个 Hello.dll#xff0c;里面有一个 char* …请用写一段代码让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返回的内存和预想不同某些字节顺序被打乱了。 WTF不是说编程没有玄学吗
刚开始我们认为是dll本身的问题但是经过测试发现dll本身没有问题直接通过C#或者python调用dll返回的内存都是正确的。这可就见鬼了难道只有unity有问题终究还是unity抗下了所有。
但有个奇怪的地方只有在编辑器里运行有问题打包出来运行也没问题。经过缜密的思考反复实验我们猜测是debug库release库的问题也就是说编辑模式下得使用debug库才行。经过实验果然如此换成debug版本的dll在编辑模式下也能得到正确的结果。
于是我们踩出第一个坑某些dll在unity编辑模式下调用不正确得换成debug版本的dll。注意并不是所有的dll都会如此而且大部分dll都不必如此只有我们手动编译的FreeImage库出现了这个问题。
满心欢喜以为问题完美解决可惜还是太年轻福兮祸所伏没想到还是个连环坑。使用debug库之后调用dll时unity直接崩溃而且是悄无声息的就这么退出了不带走一片云彩。 观察 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运行的。