28

我使用 Add As Link 选项在多个程序集中包含相同源文件的实例。我特别需要在这些程序集中包含相同源的实例,因为它负责必须在程序集内部进行的许可证验证。跨模块边界执行许可证调用可能会带来安全风险。

我的解决方案中包含代码的一些项目依赖于也包含它的其他模块,从而导致警告CS0436

“[licence.cs 完整路径] 中的类型 [type] 与 [依赖项目也包括 licence.cs] 中的导入类型 [LicenceClass] 冲突。使用 [licence.cs 完整路径] 中定义的类型”。

我曾尝试声明一个类别名,但 licence.cs 内部的定义会导致相同的警告。在别名中,必须有对导致相同警告的重复类名的引用。

我知道在程序集之间复制源代码是不好的做法,但在这种情况下是故意的。我宁愿保留每个程序集链接到的中央实例,而不是具有重命名类的专用实例以避免警告。

我的解决方法是简单地使用#pragma. 有没有更优雅的解决方案?

4

6 回答 6

20

值得注意的是,获得此类警告的另一种方法是简单地在 Visual Studio 中设置一个项目以引用自身:References -> Solution -> etc etc(我如何计算出这个 gem 留给读者作为练习...... )

Visual Studio 将很高兴地遵守,只是在构建期间抛出 OP 描述的类型的警告墙,这是可以预期的(在反射时),因为每个类等都被定义了两次。

于 2016-01-29T14:04:29.500 回答
16

唯一发生冲突的情况是两个依赖类包含同一个类。有两种解决方法:

  1. 禁用导致 CS0436 的类中的警告:

    #pragma warning disable 0436
    
  2. 有一个单独的类实例,在每个客户项目中唯一命名(从维护的角度来看是不可取的)。

编辑:还有一个解决方案:按照下面的 Mark 建议做,并标记重复的类internal

于 2013-02-22T17:49:17.890 回答
10

当我迁移到 VS2015 时,我有一个从 ASP.NET 3.5 转换为 4.5 的 Web 应用程序。我开始将此视为警告,但解决方案仍然可以编译。没有循环引用,清理解决方案并删除binandobj文件夹没有帮助。

事实证明,VS2015 对我在 App_Code 文件夹中的一些类不满意。此处的类与父文件夹中的其余网页具有相同的命名空间。一旦我将这些类移出 App_Code 文件夹并移至 Web 应用程序的顶层,警告就消失了。

于 2016-03-31T12:45:15.540 回答
2

在 .NET Core 中,您还可以禁用 project.json 中的警告:

{
  "buildOptions":
  {
    "nowarn":
    [
      "CS0436"
    ]
  }
}
于 2016-09-03T11:49:53.427 回答
1

我有这个错误,但不是 2 个不同的类!
每个新班级都与自己发生冲突,所以很明显我有那个CS0436 Error

经过一番挣扎后,我发现它是关于Mirror Asset我在多人 Unity 项目中使用的。Mirror 不知何故包含了我创建的每个新类(并继承自NetworkBehavior)。

我的外部编辑器是VSCode(Visual Studio 代码,解决方案也可能适用于 Visual Studio)。

解决方案


Edit / Preferences / External tools / "Generate .csproj files for:"
我开始测试不同的设置时,这对我有用:(
不确定确切的设置是否适用于所有人,但项目中没有正确的文件会导致此错误。就像我的情况一样。)

Regenerate project files应用这些设置(或适合您项目的设置)后,单击并重新启动 Unity 和 VSCode。

于 2020-08-10T06:53:57.950 回答
0

我在临时删除一些源文件并稍后恢复它们时遇到过这种情况。IDE(在我的例子中是 Rider)碰巧尝试恢复这些类,所以当它们丢失时,它只是添加了对生成的 exe 的引用。显然,当我恢复文件时,它们看起来是重复的。插入的参考 IDE 如下所示,只需将其删除即可修复:

<Reference Include="AppName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <HintPath>bin\x86\Debug\AppName.exe</HintPath>
</Reference>
于 2022-02-14T16:40:35.827 回答