C# “类型”;行动<;T1、T2、T3>&引用;存在于2个DLL中,如何指定使用哪一个或仅避免使用哪一个?

C# “类型”;行动<;T1、T2、T3>&引用;存在于2个DLL中,如何指定使用哪一个或仅避免使用哪一个?,c#,dll,types,socket.io,C#,Dll,Types,Socket.io,我使用Unity3D制作了一个应用程序,并使用了Unity 2019.1,但当我使用Unity 2019.1时,会出现以下错误: /.../Unity.app/Contents/Resources/PackageManager/BuiltInPackages/com.unity.timeline/Runtime/TrackAsset.cs(17,38): error CS0433: The type 'Action<T1, T2, T3>' exists in both 'WebSo

我使用Unity3D制作了一个应用程序,并使用了Unity 2019.1,但当我使用Unity 2019.1时,会出现以下错误:

/.../Unity.app/Contents/Resources/PackageManager/BuiltInPackages/com.unity.timeline/Runtime/TrackAsset.cs(17,38): error CS0433: The type 'Action<T1, T2, T3>' exists in both 'WebSocket4Net, Version=0.14.1.0, Culture=neutral, PublicKeyToken=eb4e154b696bf72a' and 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
默认情况下,HashSet应该具有此方法

尝试从plugins文件夹中删除所有3个DLL以避免出现这些问题,但是我没有套接字


有办法解决这个问题吗?我不想深入到库中去修复这个错误,但是还有其他解决方案吗?

我假设您的意思是“在相同的完整名称空间中”;如果这个假设是错误的,并且它们只是在不同的名称空间中,那么:只需使用全名限定,即
global::Foo.Bar.Whatever
,而不是
Whatever
。为了方便起见,您还可以按每个文件添加“使用别名”,即

使用Mwahaha=global::Foo.Bar.Whatever;
现在,每当您在该文件中表示
global::Foo.Bar.时,都可以使用
Mwahaha
作为别名


所以,;回到我的假设,您的意思是“在相同的完整命名空间中”:

冲突的完整类型名称是一个主要的难题,如何修复它很大程度上取决于构建链。这里最简单的修复方法是鼓励库作者不要这样做,如果他们为兼容性添加的东西现在在“官方”位置可用(即,如果库A添加了类型,则稍后使用“官方”)版本添加到某个地方,库A可以删除其版本,并添加
[汇编:TypeForwardedTo(typeof(type))]
其中
类型现在来自“官方”如果类型确实兼容,则所有内容都应该正常工作,甚至不中断调用者;在A中需要该类型的调用者将被自动重定向到正式版本,甚至不需要重新编译)

否则

编译器支持这一点,但通过一种称为“外部别名”的方式。当您引用任何dll时,默认情况下,它会获取
全局
命名空间别名。但是,特别是对于这个场景,您可以覆盖它,并告诉它每个dll使用哪个名称空间。因此,您可以说,从
a.dll
global
(即默认值),但是从
b.dll
blah
命名空间别名。然后,您需要在每个文件中使用,您希望从
blah
(即从
b.dll
)访问内容。这很快就会让人恼火,但效果很好。简短的版本是:

extern别名废话;
然后在该文件中的每个位置使用
blah::Foo.Bar.which
引用
b.dll中的
Foo.Bar.which
;或与“使用别名”结合使用:

extern别名废话;
使用Mwahaha=blah::Foo.Bar.which;
现在
Mwahaha
指的是
Foo.Bar.Whatever
来自
b.dll
但仅在该文件中


上面的文章介绍了如何使用
csc
指定每个dll别名,但实际上几乎没有人直接使用
csc

对于Visual Studio中的旧式csproj,可以在引用的“属性”窗口中指定别名。对于新型csproj,您必须使用丑陋的黑客:


废话
至于如何使用unity build链做到这一点:你的猜测和我的一样好

'HashSet<GameObject>' does not contain a definition for 'Contains' and no accessible extension method 'Contains' accepting a first argument of type 'HashSet<GameObject>' could be found (are you missing a using directive or an assembly reference?)