vovgou / loxodon-framework

An MVVM & Databinding framework that can use C# and Lua to develop games
MIT License
1.86k stars 363 forks source link

[Fody]当项目中有其他包引用了Mono.Cecil相关的库文件会报错 #29

Closed MUDV587 closed 1 year ago

MUDV587 commented 1 year ago

当项目中有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 然后重新设置相关引用,这样可以解决问题。

Snipaste_2022-09-09_11-41-31

我这个改动对项目结构改动有点大,我不确定提交一个pr是否合适。

同时,个人也觉得引用的第三方库最好是做成package标注版本,这样也方便使用者比对版本,升级之类的。

vovgou commented 1 year ago

你用的是最新版本么?这个冲突我改过如下图可以解决问题。直接引入第三方库是一个没辙的方案,因为Unity没有中央仓库,没办法所有第三方包都通过中央仓库引入。如果自己将第三方仓库发布也同样有问题,因为没有统一的中央仓库管理,大家都发布在不同的第三方仓库,各自发布自己的,各自引入自己的,最终还是会冲突。

image

MUDV587 commented 1 year ago

我使用的是Unity2021.3.1f1,默认的Windows平台,Fody包版本 com.vovgou.loxodon-framework-fody@e8b32d45e8 应该是新版Unity做了一些改动吧。

用空工程重新复现了一下,简单记录一下遇到的问题。

1 导入之后就会报错,可能是.asmdef的配置选项有所更新,导致某些配置不正确。标红框的是修改的地方 1 2

这些配置修改后,Fody就不报错,也可以正常使用了

2 导入com.unity.runtime-scene-serialization@0.6.0 导入之后,就会报Mono.Cecil相关库文件的冲突 我看Burst对相关库文件的处理是这样的,就参考了一下 3

将Fody库里面的Mono.Cecil改名就可以解决问题了,改成这样: 4

至此,就可以正常使用Fody和runtime-scene-serialization了

vovgou commented 1 year ago

这个设置是对的,见图:PropertyChanged.Fody.dll我特意排除在项目之外的,它这个库没有命名空间,导致跟别的一些库类名冲突,这样库只有在执行静态织入时使用,平时也不需要,所以我特意排除在项目之外,通过在织入时动态加载dll载入的。

和这个库相同的目录下报错的那2个类是没用的,应该是需要被删除的,我开发的github库和发布的不是同一个库,漏删了。直接删除就好。回头我发布新版本删除一下。 image

另外你引入的那个runtime-scene-serialization插件,你的unity版本是哪个?我都下载不到这个插件。回头我找了这个插件试试,不过这种情况不是很好避免,大家引入第三方库没有统一的规范。

遇到这种问题,你可以讲包拷贝到 Packages目录中,然后删除@和后面的版本号,变成一个本地包,就可以随便改了,如下图:

image

MUDV587 commented 1 year ago

我使用的是Unity 2021.3.1f1 com.unity.runtime-scene-serialization@0.6.0 这个库应该还在preview阶段

我刚刚试了一下打包好的Fody版本,把Mono.Cecil相关的库文件放到自定义的本地包目录可以解决不同版本Mono.Cecil引用冲突的问题,放在Assets目录下的Mono.Cecil没法避免冲突。

非常感谢您的耐心解答!

vovgou commented 1 year ago

我刚才也测试了下,查看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)不,这个沟通效率比较低

MUDV587 commented 1 year ago

我进一下群吧

vovgou commented 1 year ago

我进一下群吧

好的,你进群了@我一下