目录
前言
一、开发环境介绍
1. Unity版本
2. 发布平台
3. 本次目标
二、围绕NPOI的失败历程(纯吐槽,可跳过)
三、记录正确步骤
1. 准备环境
①.创建/打开c#类库
②. VS打开NuGet包管理器
2. 整理包以及依赖
①. Nuget搜索插件
②. 查看依赖项
③. 整理依赖项
3. 下载并导入Unity
①. 下载所有包
②. 提取包
③. 导入Unity
四、总结
五、问题汇总
六、下载链接
前言
以前总遇到一个问题:明明找到了开源库但用起来很麻烦。网上找别人编好的dll不仅要花费大量时间,还不一定能用,即便能用换个环境就有不行了(Unity经常需要多平台发布)。自己编译的话呢又够呛,创空白工程自己从头写代码倒是能编译成功,但是将现有工程生成DLL总是失败。。。
这次误打误撞终于走通了,Nuget这个宝藏终于能扛回家了!!有种村里终于通上高速路的感觉……
一、开发环境介绍
1. Unity版本
当前使用的unity版本是2022.1.8f1
推测:能使用.Net4.x或者.NetStandard2.0及以上的高版本都行
至于只能使用.net2.0的低版本可能够呛,Nuget里好像都是.net4起步的
2. 发布平台
当前平台是安卓,选的是.NetStandard2.1
其他平台看Unity发布设置Configuration -> Api Compatibility Level
Nuget里依赖项的确定与Unity设置一致(后面有截图,nuget里都列出来了)
3. 本次目标
功能:手机使用NPOI插件动态生成word(功能不重要,主要是提取dll)
核心:其实就是如何获取所需的dll。咳咳,要能用的哦!!
二、围绕NPOI的失败历程(纯吐槽,可跳过)
a. GitHub找到了NPOI插件,发现源码没有dll,缺少.NETFramework7.2,无法打开,放弃。
b. 第一次寻找到别人编好的DLL,导入直接报错。
c. 从Nuget提取编译好的NPOI,但是导入报错,缺少ICSharpCode.SharpZipLib。这个库网上也找了找但导入后版本不对,Github上找到了原始工程但也是要编译,心想着NPOI这一个都没搞定还来第二个,果断放弃。
d. 第N次找到别人编号的DLL,能用!!!
① 编译器能用,发布没报错,真开心,看来这功能很快就能开发完了;
② 出现问题:编译器生成word能正常打开且格式正确,但是发布apk后全是乱码。。。心里的第一反应就是坑爹的WPS误我,下载手机Office (电脑是office2019,手机是wps,有这反应挺正常的吧,不是鄙视)。。。。然而我太天真了,没意识到问题的严重性。。。当编译器生成的word能在手机打开,手机生成的word电脑上打不开时,醒悟不是office和wps的问题,虽然感觉有点不对但也没当回事,以为手机可能要单独设置些什么。。。当字体、编码、样式等都改了一遍但问题依旧,又当代码只生成一行英文打开依然乱码时,发现真坑爹。。。接下来是Unity引擎设置、项目设置都检查一遍,问题依旧。。。没办法,换方法:新建个模板,用代码打开进行关键字替换,这样就不需要担心格式问题了。。。当我发现关键字替换预期与实际不符时真的懵了:替换成功了,但又没成功。成功是因为关键字确实被替换了,失败是别替换的字不对:代码是用“B”替换“ACCC”中的“A”,输出结果应该是“BCCC”,实际是输出“DCCC”。。。。加完断点一测发现插件函数功能不对:tempText = tempText.Replace("A", “B”);。。。。震惊:函数功能居然能和函数名串台!震惊:Unity居然没报错!!震惊:披着函数的皮做着自己的事!!!
③ 猜测:沉默了半天,感觉应该是dll版本与Unity不一致,dll编译的是.NETFramework,unity安卓用的是.NETStandard2.1。
e. Unity可以将.NETStandard2.1换成.NETFramework,好像需要改什么。我没这么干,因为这会影响其他所有模块。
f. 找不到现成的.NETStandard2.1,尝试自己编译。
① .NETFramework7.2~8 都安了一遍,反正早晚要用到~
② 工程能打开,但是不会编译。。。按照记忆以及网上的教程都失败了
③ 突然想到如果将步骤c中缺少的库也从Nuget提取出来,会不会成功。结果不出意外的失败:
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 无法安装程序包“SharpZipLib 1.4.2”。你正在尝试将此程序包安装到目标为“native,Version=v0.0”的项目中,但该程序包不包含任何与该框架兼容的程序集引用或内容文件。有关详细信息,请联系程序包作者。此问题的解决方案见下方问题汇总
④ unity论坛、百度、谷歌搜遍了,依然是编译失败、Nuget提取失败。
⑤ 突然醒悟:我居然拿c++来编译c#。。。(其实之前怀疑过,但没找到c#模板以为通用)
⑥ 安装完c#开发环境,找到c#模板,终于成功使用Nuget提取出类库。。。但用起来还是报错
⑦ 痛苦中沉沦了半天后,静下心来,打开Nuget认真研究了一遍(之前都是对照教程无脑听指挥),突然灵光一闪:我就对照依赖表,他要什么我就从nuget里提取什么,依赖项全部提取出来不就行了嘛。(感觉有戏)
⑧ 全部提取出来了13个类库(我是建了一个Excel的,当时越整理越没底死马当活马医了)。
⑨ 逐个导入unity,发现能用了。以为这我就会高兴?我有那么天真??没经过实战检测的成功也能算成功???果然,发布Apk失败:
ArgumentException: The Assembly System.Security.Cryptography.Xml is referenced by NPOI.OOXML ('Assets/Office/Plugins/NPOI.OOXML.dll'). But the dll is not allowed to be included or could not be found.此问题的解决方案见下方问题汇总
⑩ System.Security.Cryptography.Xml这玩意依赖表里没有啊,难道NPOI的XML文件的问题?把所有DLL的XML删除,果然问题依旧,毕竟XML只是注释。
⑪ 怀疑是.NETStandard2.1不兼容.NETStandard2.0,因为NPOI和SharpZipLib我用的是2.1,其他用的2.0,发现问题不但没解决,还出现新的错误,果断换回来了。
⑫ 多种尝试无果后,又突发奇想,却这玩意我就去nuget提取呗,管他依赖表里有没有,万一是作者写漏了呢?然后就是。。。 !!! ~\(≧▽≦)/~
三、记录正确步骤
1. 准备环境
目的:此步骤为了用VS提取Nuget里的包
前置:
a. 我用的是VS2019,其他版本应该没啥,与Unity匹配就行。
b. VS装有c#的开发环境,见下图:
步骤:
①.创建/打开c#类库
创建c#类库,准备提取包 (自己已有工程也能用,这只是个工具人工具类)
注意:创建VS工程时,选C#模板,别想我之前一样没找到c#模板拿DLL或者c++的来凑合。
②. VS打开NuGet包管理器
2. 整理包以及依赖
目的:找到需要下载的所有包,准备下载
注意:只整理先不下载,防止下错版本或者版本混乱了
步骤:
①. Nuget搜索插件
图片说明:左上角浏览 -> 搜索包名 -> 选择包 -> 中间查看版本和依赖项 -> 右侧是已下载的包(先忽略)
找不到窗口,直接重置布局:工具栏"窗口" -> 重置窗口布局
②. 查看依赖项
图中我用的是.NetStandard2.1,根据自己情况选择。(上方“2. 发布平台”章节有提到)
不同版本依赖项也不同(高版本依赖比较多,可适当降版本)
③. 整理依赖项
下图是我用EXCEL整理的NPOI所有依赖包,部分版本忘标注了,VS截图里有。
跟据我观察4.5.0版本比较合适,具体以实际为准O(∩_∩)O
注:这步先确定所有依赖项都能从Nuget找到且依赖包版本全部符合。
(虽然缺失的概率小,但是万一呢。。。)
3. 下载并导入Unity
①. 下载所有包
小技巧:在上面整理的Excel中从后往前下载。VS右上角有已安装包的版本介绍,有依赖的包可以对照已安装检查核对一下再下载。
②. 提取包
VS已安装包中,右键->在文件资源管理器中打开文件夹
dll就在lib文件夹下面,选择需要的版本就行。
③. 导入Unity
拖拽到Unity的Plugins文件夹下就行。建议下载完一起导入。
多平台需要创建子平台文件夹,例如 Plugins -> Android -> xxx.dll
四、总结
1. 此方法虽然可行,但是因为导入了一大堆依赖项会使工程变大。我这工程发布的APK比之前大了3M……好吧,我能接受~~
2. 比较繁琐,一大堆依赖项逐个比对版本。。。
3. NuGet好像没有.Net2.0的包,所以此方法不适合旧版的unity
4. NuGet有.Net4.x和.NetStandard2.0以及更高版本的库,高版本unity应该能用
5. 之前有人说NuGet能用,有人说不能用。原因是有些库没有依赖项,比如Newtonsoft.Json
6. 其实很简单的,只是这条路之前没走过有点彷徨。
五、问题汇总
问题一:NuGet安装包失败
错误:严重性 代码 说明 项目 文件 行 禁止显示状态 错误 无法安装程序包“SharpZipLib 1.4.2”。你正在尝试将此程序包安装到目标为“native,Version=v0.0”的项目中,但该程序包不包含任何与该框架兼容的程序集引用或内容文件。有关详细信息,请联系程序包作者。
原因:项目是c++,安装程序包是c#,不是同一种开发语言
解决:用安装程序包的语言创建项目,这里是用c#创建工程。
问题二:发布APK失败
错误:ArgumentException: The Assembly System.Security.Cryptography.Xml is referenced by NPOI.OOXML ('Assets/Office/Plugins/NPOI.OOXML.dll'). But the dll is not allowed to be included or could not be found.
原因:缺少依赖,可能整理依赖表的人写漏了
解决:去Nuget里寻找这个依赖包 (记得递归这个包的依赖,O(∩_∩)O:依赖的依赖也是我的依赖)
问题三:依赖项搞错或者版本不符
错误:切换插件.NetStandard版本后出错,比如我之前测试从2.1降到2.0后出现新的错误。
原因:不同版本依赖项不同
解决:去Nuget核对更换后版本的依赖项,逐个添加。文章来源:https://www.toymoban.com/news/detail-705574.html
六、下载链接
NPOI插件在NetStandard2_1版本的库.zip
提取码:CLPS文章来源地址https://www.toymoban.com/news/detail-705574.html
到了这里,关于Unity 使用NuGet获取所需dll —— 示例:安卓 + NPOI插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!