Unity 2017 UWP托管插件构建时Reference Rewriter报错求助
嘿,我之前在给Unity做UWP蓝牙插件的时候也踩过这个Reference Rewriter的坑,结合你的场景,给你几个实用的解决思路:
正确隔离平台专属插件
把你的UWP真实插件放在项目的Plugins/WSA目录下,而编辑器用的占位插件放在普通Plugins目录(或者单独创建非UWP的插件目录)。然后在插件的Inspector面板里,给UWP插件只勾选WSAPlayer平台,取消其他平台的勾选。这样Unity会自动在编辑器用占位、UWP构建时用真实插件,避免编辑器加载UWP专属API导致的引用混乱。调整.NET和UWP构建配置
虽然你用的是.NET 3.5全基类框架,可以先尝试切换到.NET 4.x Equivalent(Unity 2017支持这个选项),再切回.NET 3.5,有时候能清理程序集引用的缓存问题。另外在UWP构建设置里,把API Compatibility Level设为.NET for UWP,确保Unity正确匹配UWP的API合约版本(你这里是10.0.17134.0)。用条件编译隔离代码
在你的插件代码里用条件编译指令,把UWP专属代码和占位代码完全隔离开,比如:#if UNITY_WSA && !UNITY_EDITOR // 这里写UWP蓝牙通信的真实实现 using Windows.Devices.Bluetooth; public class BluetoothManager : IBluetoothInterface { // UWP专属逻辑 } #else // 编辑器和其他平台的占位实现 public class BluetoothManager : IBluetoothInterface { // 空实现或模拟逻辑 } #endif这样Unity在编辑器里只会编译占位代码,不会触及UWP的API,从根源避免Reference Rewriter处理不兼容的引用。
添加link.xml避免Rewriter误处理
如果以上方法都不行,就在项目Assets目录下创建一个link.xml文件,告诉Reference Rewriter不要修改你的核心程序集,比如:<linker> <assembly fullname="Assembly-CSharp" preserve="all"/> <assembly fullname="你的UWP插件DLL名称" preserve="all"/> </linker>这个配置能防止Rewriter误删UWP构建所需的必要引用。
检查UWP插件的API引用
确保你的UWP插件正确引用了Windows.Devices.Bluetooth相关的API合约,并且引用的SDK版本和Unity构建时使用的10.0.17134.0完全一致,不匹配的版本也会导致Rewriter报错。
内容的提问来源于stack exchange,提问作者Nick

