c# - 为 Unity 编译 DLL 时使用什么目标框架和引用
问题描述
我有一些我在 Unity 2019.4 中通常使用的脚本,并且还编译成单独的 DLL 以在没有源代码的情况下分发。一切正常,直到我开始System.Array.Empty<T>()
在几个地方使用,这在 Unity 中运行良好,但阻止我编译单独的 DLL。
- 最初,我将 Target Framework 设置为
Unity 3.5 .net full Base Class Libraries
,但这现在给了我错误:'Array' does not contain a definition for 'Empty'
- 显然
Array.Empty
是在 中添加的.NET Framework 4.6
,但是如果我将 Target Framework 设置为那个(或更高版本),我会得到:The type 'ISet<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
从我使用的任何地方 aHashSet<T>
(即使我没有ISet<>
直接使用)。 - 如果我手动添加
System.dll
对 Unity 安装目录中的引用,它会给出完全相同的错误,但现在说ISet<>
是在netstandard
dll 中。 netstandard.dll
从 Unity 安装目录添加对Predefined type 'System.Object' is not defined or imported
.- 试图通过引用来解决这个
mscorlib.dll
问题The type 'HashSet<T>' exists in both 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' and 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
那么我应该使用什么目标框架和参考来为 Unity 2019.4 编译 DLL?
解决方案
我通过复制 Unity 为装配定义生成的一个 csproj 文件并删除我不需要的东西来解决了这个问题。
主要区别似乎是包含此块:
<PropertyGroup>
<NoConfig>true</NoConfig>
<NoStdLib>true</NoStdLib>
<AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>
<ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>
<ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>
</PropertyGroup>
我猜这允许它定义自己对 , 的引用mscorlib.dll
,netstandard.dll
并且System.Core.dll
不会与框架导入的引用发生冲突。
推荐阅读
- r - 如何修复 mcode 的“模型构建步骤失败”错误(在“mrgsolve”包下)?警告消息“'make' not found”是什么意思?
- python - 如何以交互式图形的形式保存 matplotlib 3d 绘图的输出?
- javascript - 通过节点显示 javascript 对象的格式
- java - 编译器没有识别出我已经从它实现的接口实现了 compareTo() 方法
- python - 从文本文件中解析电子邮件信息
- exoplayer - 如何在 ExoPlayer for AndroidTV 中实现视频清理?
- assembly - 汇编和标准输出中的 fprintf
- angular - Angular 6使用takeUntil防止组件中的多个Observable内存泄漏
- c# - 像电开关这样的设计模式?
- reactjs - React-bootstrap Carousels 垂直渲染