[Fody]当项目中有其他包引用了Mono.Cecil相关的库文件会报错
MUDV587 opened this issue · 7 comments
当项目中有Package引用Mono.Cecil相关的库,会导致库文件冲突。
例如引用这个库com.unity.runtime-scene-serialization
我对Fody中引用的Mono.Cecil是否有做什么特殊的定制不太清楚。
目前我采用的办法是把Fody和PropertyChanged.Fody单独做成Package,然后把
Mono.Cecil
Mono.Cecil.Pdb
Mono.Cecil.Rocks
这三个文件的文件名改变成
Fody.Mono.Cecil
Fody.Mono.Cecil.Pdb
Fody.Mono.Cecil.Rocks
然后重新设置相关引用,这样可以解决问题。
我这个改动对项目结构改动有点大,我不确定提交一个pr是否合适。
同时,个人也觉得引用的第三方库最好是做成package标注版本,这样也方便使用者比对版本,升级之类的。
我使用的是Unity2021.3.1f1,默认的Windows平台,Fody包版本 com.vovgou.loxodon-framework-fody@e8b32d45e8 应该是新版Unity做了一些改动吧。
用空工程重新复现了一下,简单记录一下遇到的问题。
1 导入之后就会报错,可能是.asmdef的配置选项有所更新,导致某些配置不正确。标红框的是修改的地方
这些配置修改后,Fody就不报错,也可以正常使用了
2 导入com.unity.runtime-scene-serialization@0.6.0
导入之后,就会报Mono.Cecil相关库文件的冲突
我看Burst对相关库文件的处理是这样的,就参考了一下
将Fody库里面的Mono.Cecil改名就可以解决问题了,改成这样:
至此,就可以正常使用Fody和runtime-scene-serialization了
这个设置是对的,见图:PropertyChanged.Fody.dll我特意排除在项目之外的,它这个库没有命名空间,导致跟别的一些库类名冲突,这样库只有在执行静态织入时使用,平时也不需要,所以我特意排除在项目之外,通过在织入时动态加载dll载入的。
和这个库相同的目录下报错的那2个类是没用的,应该是需要被删除的,我开发的github库和发布的不是同一个库,漏删了。直接删除就好。回头我发布新版本删除一下。
另外你引入的那个runtime-scene-serialization插件,你的unity版本是哪个?我都下载不到这个插件。回头我找了这个插件试试,不过这种情况不是很好避免,大家引入第三方库没有统一的规范。
遇到这种问题,你可以讲包拷贝到 Packages目录中,然后删除@和后面的版本号,变成一个本地包,就可以随便改了,如下图:
我使用的是Unity 2021.3.1f1
com.unity.runtime-scene-serialization@0.6.0 这个库应该还在preview阶段
我刚刚试了一下打包好的Fody版本,把Mono.Cecil相关的库文件放到自定义的本地包目录可以解决不同版本Mono.Cecil引用冲突的问题,放在Assets目录下的Mono.Cecil没法避免冲突。
非常感谢您的耐心解答!
我刚才也测试了下,查看com.unity.runtime-scene-serialization插件,它引入了官方提供的com.unity.nuget.mono-cecil@1.10.1,我尝试也引入这个包,结果版本不符,它这个是target 3.5版本,我需要4.x版本。看来无论怎么搞,只要同时载入Mono.Cecil.dll到内存中,都可能会冲突。
你说的这个方案是怎么做的?是将Fody相关的包都不引入项目,在需要注入代码时动态载入DLL的么?
你方便加下QQ群(622321589)不,这个沟通效率比较低
我进一下群吧
我进一下群吧
好的,你进群了@我一下