在解决方案的几个项目中引用共享项目

6
我正在尝试修复警告:
警告 CS0436:'...\SharedProject1\SharedProject1\Class1.cs'中的类型“Class1”与导入的类型“ClassLibrary1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”冲突。使用在“...\SharedProject1\SharedProject1\Class1.cs”中定义的类型。WpfApplication1 ...\SharedProject1\WpfApplication1\MainWindow.xaml.cs
重现步骤:
创建一个包含三个项目的解决方案: - SharedProject1(添加新类) - ...
namespace SharedProject1
{
    public class Class1() { }
}

ClassLibrary1

namespace ClassLibrary1
{
    public class Class1 { }
}

WpfApplication1 添加到MainWindow 构造函数中。
public MainWindow()
{
    InitializeComponent();
    var a = new SharedProject1.Class1();
    var b = new ClassLibrary1.Class1();
}
  • ClassLibrary1WpfApplication1中引用SharedProject1

  • 编译时,你会收到一个警告。

问题:如何解决这个警告?

3个回答

5

将依赖关系图从以下结构更改:

Shared -> Class
Shared -> Application

to:

Shared -> Class -> Application

那就是:从Application中删除对Shared的直接引用。
第一种方案导致相同的类构建成2个dll。这就是冲突的原因。在第二种方案中,共享库被构建到Class dll中,因此也可以被Application访问。
如果ClassApplication彼此独立,则第一种方案将是可行的。
所有这些都是因为共享项目不会生成库。因此,必须考虑使其出现在某个库中。通常只在一个地方。这通常意味着每个共享库应该只被引用一次。

3
Jarekczek的解决方案在你只有一个类库时可行,但是一旦你添加另一个引用共享项目的类库,你会再次收到相同的警告。
解决方案可能很明显,但如果不是的话,在这里就是...
你可以创建一个名为“Common”的普通类库项目,它本身不包含任何类,只引用共享项目。它作为共享代码的“容器”。
因此,引用树可能如下所示:
SharedProject -> Common
Common -> ClassLibrary1
Common -> ClassLibrary2
ClassLibrary1 -> Application
ClassLibrary2 -> Application
Common -> Application

换句话说,您建议将共享项目转换为类库。我不反对。共享项目旨在用于不同的程序集中,一旦您开始考虑将其包含到dll中-说NO,将其转换为dll并引用那些。 - Sinatr
我并没有说要将它们转换为dll。你完全可以直接从其他解决方案中包含它们。我正在发布一种可能的解决方案,用于解决多个类库在同一解决方案中引用相同共享项目时出现的冲突问题。共享项目仍然存在,没有改动。 - dbrckovi
1
“共享项目仍然存在,没有被触碰过”,只是被包装到common.dll中,并且不应该被其他任何东西使用...听起来对我来说就像是“转换” ;) - Sinatr
我们有一个包含多个dll的Windows窗体应用程序+Xamarin应用程序。Windows应用程序及其dll通过公共dll访问共享代码。Xamarin直接引用相同的共享项目,它可以完美地工作。 - dbrckovi

0
尝试将您的代码更改为以下内容:
       namespace SharedProject1{public class Class1() { }}

在你的项目WpfApplication1中,你必须添加对SharedProject1和ClassLibrary1的引用,之后它会正常工作:
我已经根据你的规格为你创建了一个项目: 项目示例

谢谢您在发布问题时纠正我的错别字。然而,问题仍然存在。 - Sinatr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接