【Unity】使用 System.Windows.Forms 的问题

news2025/1/14 18:40:08

        因为最近开发需要用到使用 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 来解决:

Unity 使用System.Windows.Forms.dll 库打包后,运行报错!_humilezr的博客-CSDN博客_unity dll打包程序运行不对好久没写博客了,年前接了一个项目,项目中需要为文件选择存储路径,然后就选择了比较常用的System.Windows.Forms.dll 库。 在Unity编辑器模式下没任何问题,但是打包后,无法打开存储路径选择弹窗,调试发现是报InvalidProgramException错误。可是打包后包里明明有System.Windows.Forms.dll 这个库,经过搜集资料...https://blog.csdn.net/humilezr/article/details/104615462        导入 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,我感觉这个思路挺靠谱的:

c # - the error occurs only after building openfiledialog in unityIn unity, I decided to use OpenFileDialog to specify the file. https://qiita.com/otochan/items/0f20fad94467bb2c2572 I imicon-default.png?t=M85Bhttps://www.tutorialfor.com/questions-317730.htm

        之前是直接复制的 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、总结

  1. 找到Unity的安装目录,在此目录下:……\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32 找到System.Windows.Forms.dll 这个文件。
  2. 将其放到Plugins下,Unity会自动添加引用。
  3. 直接代码使用打包即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB算法实战应用案例精讲-【连接分析】PageRank

前言 拉里佩奇 Larry Page和谢尔盖布林 Sergey Brin于1996年在斯坦福大学开发了PageRank算法,此后于1998年基于该算法,共同创立了Google公司。PageRank这个名字一语双关,既源于其算法创始人Larry Page,也源于网页 Web Page。 PageRank算法将网页按重要性进行排序。有了这…

搭建nacos

一、nacos的介绍 开启nacos的作用: 在项目开发过程中我们可以把服务提供者的网络地址(IP,端口号)等编码到代码中, 这种做法存在许多问题: 一旦服务提供者地址变化,就需要手工修改代码一旦是…

Wireshark TS | Packet Challenge 之 DNS 案例分析

前言 来自于 Sharkfest Packet Challenge 中的一个数据包案例,Sharkfest 是 Wireshark 官方组织的一年一度的大会,致力于在 Wireshark 开发人员和用户社区之间分享知识、经验和最佳实践。印象中早期是一年一次,近几年发展成一年两次&#xf…

艾美捷超氧化物歧化酶检测试剂盒参数说明

超氧化物歧化酶是催化超氧化物离子O2-的歧化反应2O2-+2H →O2+H2O2的酶.EC1.15.1.1.是金属酶,已知在金属酶中有真核生物细胞质的深绿色Cu-Zn酶(分子量约3万)、线粒体、细菌红紫色的M…

Debian系列-在新的GNOME下无法启动Qt

Debian系列-在新的GNOME下无法启动Qt 文章目录Debian系列-在新的GNOME下无法启动Qt摘要启动Qt 报错 No protocol specified解决方法1 打开一个新的终端2 echo $DISPLAY3 export DISPLAY更新一下关键字: Debian、 Qt、 xcb、 No protocol specified、 关键字5摘要 …

转行做程序员,哪种编程语言既高薪又适合你?

“你为什么学习这门编程语言”?大多人当初面对选择这个问题的时候,都只是单纯的“听朋友说”或是百度看到了表面,或者是一拍脑门决定的。其实并不了解这个编程语言的特性和市场现状以及这个语言是否适合自己。 这类的情况还是算是好的&#x…

并发编程学习(四):wait()、nitify()

1、wait、notify原理 Owner 线程发现条件不满足,调用wait()方法,即可进入WaitSet,变为WAITING 状态。BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片。BLOCKED线程会在Owner线程释放锁时唤醒。WAITING线程会在Owner线程调…

【数据库】简答题知识点

数据库系统的结构 数据库系统的逻辑结构可以分为用户级、概念级和物理级三个层次。每个层次的数据库都有自身对数据进行逻辑描述的模式,分另称为外模式、概念模式和内模式。 外模式:是与和具体的应用或者项目有关的逻辑表示,用户可以操作的…

【Proteus仿真】【51单片机】自动浇花灌溉系统设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶、按键、DS18B20、PCF8591 ADC、土壤湿度传感器、水位传感器、蜂鸣器模块等。 系统运行后,LCD1602显示传感器检测的温度、湿…

【Linux操作系统】多线程(一)

文章目录1. 线程概念2. 线程控制2.1 创建线程2.2 线程ID2.3 线程等待2.4 线程终止2.5 线程分离3. 线程同互斥与同步3.1 互斥量3.2 死锁3.3 同步-条件变量3.4 生产者消费者模型3.5 POSIX信号量3.6 基于环形队列的生产消费者模型1. 线程概念 线程:是在进程内部运行的…

解决资源消耗,top的运用记录

第一条命令uptime load average 后面的三个数字,分别代表1分钟、5分钟和15分钟内机器的平均负载 使用top命令解决负载问题 Cpu(s)这一行提供了CPU运行情况信息 这些缩写分别代表了不同含义 (1)us:用户CPU时间 运行非优雅的用户进程所占CPU时间的百…

离线下载NLTK依赖包([WinError 10061] 由于目标计算机积极拒绝,无法连接)的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

房产管理系统CAD图形管理应用有哪些?

数图互通房产管理 数图互通房产管理系统建设涵盖学校所有房屋资源管理业务以及CAD图纸的管理,对不同类型的房屋实现相应的业务子系统,实现完善、高效、可溯的房屋资源业务管理,保证数据的完整性、一致性和精确性,及业务的。 通过…

向内而生 向远而行 | 希尔贝壳荣获“2022年度最具投资价值创新企业”奖

12月22日,以“向内而生 向远而行”为主题的2022年度猎云网创投奖项评选正式落下帷幕,各项榜单评选结果正式发布。希尔贝壳凭借先进的技术创新能力获评“2022年度最具投资价值创新企业”奖。 获奖理由 北京希尔贝壳科技有限公司成立于2017年,…

可视化 相机pose或者 pose视锥

可视化 相机pose或者 pose视锥 https://www.camcalib.io/post/visualizing-camera-calibration-results https://bitbucket.org/iviso/camcalib_multiview_pointcloud_example/src/master/ https://bitbucket.org/iviso/ 其他: https://towardsdatascience.com/c…

快速部署PHP Web环境(nginx php mysql redis)

先看最终效果,如下: 它是什么? 它是 docker 容器虚拟化技术。总共只有几KB大小的描述文件,文件里定义了要安装什么、配置什么,一执行就全自动处理好了。 它有什么用? 解决新来同事搭环境搭半天的问题解…

矽昌-- Station 模式支持

Station 模式支持 1. 修改配置 ​ 在/etc/config/wireless中增加一段即可,实例如下: config wifi-ifaceoption key 12345678option ifname sfi0option network wwanoption encryption psk2ccmpoption device radio0option mode staoption bssid A8:5A:…

玩以太坊链上项目的必备技能(修改器 [modifier]-Solidity之旅十五)

修改器(modifier) 在讲修改器(modifier)之前,我们使用前面几篇文章所学到的知识来实现一个简单的 token 类合约。 // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0;contract InheritanceModifierExampl…

Python获取与处理文件路径/目录路径

这里写目录标题文件目录结构说明一、路径获取1.1 获取当前文件的绝对路径1.2.1 获取当前文件的所在目录1.2.2 获取当前文件的所在目录的上一级目录1.3 获取当前文件名1.4 获取当前文件对于基准路径的相对路径二、路径判断2.1 判断路径是否存在2.2 判断路径是否为绝对路径2.3 判…

【Python】matplotlib.axes.Axes.pie()实例讲解

目录:matplotlib.axes.Axes.pie函数实力讲解一、前言二、matplotlib.axes.Axes.pie()函数三、代码示例四、get_cmap函数一、前言 本文章向大家介绍Python matplotlib.axes.Axes.pie()实例讲解,主要分析其语法、参数、返回值和注意事项,并结合…