Unity 使用NuGet获取所需dll —— 示例:安卓 + NPOI插件

目录

前言

一、开发环境介绍

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核对更换后版本的依赖项,逐个添加。

六、下载链接

NPOI插件在NetStandard2_1版本的库.zip
提取码:CLPS

猜你喜欢

转载自blog.csdn.net/qq_26686865/article/details/129302995