【Unity】使用 System.Windows.Forms 的问题
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
因为最近开发需要用到使用 Windows 自带的窗口打开、文件选择等功能然后兜兜转转需要使用 System.Windows.Forms 这个库。这个库在 WinForm 里是很常见的但是要在 Unity 里使用并打包出来还是有些坑的。
我这里使用的 Unity 版本2022.2.1f1c1
PS这个显然只能在PC上使用想都不用想 ~
1、引入 System.Windows.Forms.dll
首先这个 dll 不能从 vs 那里找也就是 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\…… 这个文件夹下面。这个导入进去用不了会报错。
只能使用Unity自带的也就是在 ……Editor\Data\MonoBleedingEdge\lib\mono\2.0-api 这个目录下面的 dll 参考下文
Unity-使用System.Windows.Forms.dll_慧眼圣贤心的博客-CSDN博客在Unity使用Windows窗体函数https://blog.csdn.net/pgw00k/article/details/53166861 因为我是Unity2022所以没有 .Net 4.x 的选项似乎那个选项并没有什么影响都能正常跑。具体的使用方法是比较简单的
using System.Windows.Forms;
public static void OpenWindowFolder()
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.ShowDialog();
}
就这样就完成了在编辑器下运行效果如下
可以看到这个窗口的样式还是不知道哪个年代的窗口然后语言也不是中文。不过无所谓这个反正是测试用的估计是可以在参数里设置的。
但是用这个是用这个是有问题的后面会详细说明编辑器下是可以用的但是打包出来有问题不能正常运行。后面的第2、3、4章节都是问题说明和解决思路如不需要可以直接看第5小节的总结。
2、出包运行
正常打包很容易就闪退了很诡异虽然有时候能出包。我发现在 Build Setting 里把 Architecture 改成 Intel 32-bit 成功率就高了很多
实际上似乎不影响结果就是单纯地打包成功率高一些而已会减少一些报错和闪退的概率。
但是运行起来就有问题了会报空
显然是无法正常运行的然后我上网去搜了一些解决方案。
3、尝试使用csc.rsp解决
首先测试了一下这个用 csc.rsp 来解决
报错信息如下
……csc.rsp: not parsed correctly: System.Windows.Forms.dll could not be found as a system library.
If this was meant as a user reference please provide the relative path from project root (parent of the Assets folder) in the response file.
等于是只能引用到Assets同级目录下的文件是吧那不是等于没得搞本来不就是这个dll有问题嘛……
4、解决思路2更换dll文件
后面看到了有个人跟我一样的问题 unity使用 form.showDialog() 函数打包后出现空指针错误 的解决方法_参宿_七的博客-CSDN博客需要实现一个unity打开文件/文件夹选择框一开始使用path = UnityEditor.EditorUtility.OpenFilePanel("Load Images of Directory", UnityEngine.Application.dataPath, extion);方法实现但是这种方法只在编辑器里起作用不能导出exe。于是使用using System.Windows.Forms;OpenFileDialog dialog = new OpenFileDihttps://blog.csdn.net/Michaelia_hu/article/details/116015772 他提到一篇文章说是需要修改引用的dll我感觉这个思路挺靠谱的
之前是直接复制的 VS 自带的dll后面进Unity不识别报错。网上说的是要在Untiy安装目录下找 2.0.0 的那个。但是我之前用的时候就感觉有问题因为 VS 自带的 dll 大概 2.7 mb而Unity这个只有 730kb 就很怪但是在编辑器下又确实能运行。
后面我换了一个目录下的……MonoBleedingEdge\lib\mono\unityjit-win32
这个目录下面也有个 Winfrom 的dll而且有2.7mb我估计就是这个了。我把他导入到包里面然后打包出来果然成功了
可见打包出来也能正常运行了。
PS使用Winfrom阶段Unity 进程会暂停等待窗口选择的返回需要注意使用场景。
5、总结
- 找到Unity的安装目录在此目录下……\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32 找到System.Windows.Forms.dll 这个文件。
- 将其放到Plugins下Unity会自动添加引用。
- 直接代码使用打包即可。
6、注意事项
我在编辑器下使用时极易造成闪退一般情况是在调用API后当时没啥问题但是一段时间后会突然闪退目前还不清楚具体原因而且没有在打包后大量测试。目前建议是编辑器下测试时调用一下测试通过之后不要再调用此代码。