C# 在共享项目中使用引用/类库

Posted

技术标签:

【中文标题】C# 在共享项目中使用引用/类库【英文标题】:C# Using references/class library in a shared project 【发布时间】:2019-11-11 17:54:23 【问题描述】:

我刚刚在 Visual Studio 2017 中学习并创建了一个共享项目。我注意到共享项目没有“引用”来引用其他资源(其他项目、类库……)。我什至看了一下 .shproj 文件,发现它只导入了我在共享项目中创建的类。

我的问题是,如果我想创建一个插件应用程序,我需要使用类库来调用源软件公开的必要 API。 如何将其他项目/类库(或一般资源)引用/添加到我的共享项目中?或者这甚至可能吗?

这里也描述了我的部分问题reference to a shared project from other shared project

但我需要一个更通用的解决方案。谢谢大家的帮助。

【问题讨论】:

【参考方案1】:

长话短说:共享项目不能,实际上不能那样工作。

在 Visual Studio 中,共享项目只是文件(源代码、资源等)的容器,您可以将其添加到其他项目中。在某些情况下,当您希望在多个项目中拥有相同的代码(等等)而不将该代码放入库中时,这可能会很有用。

共享项目没有引用,没有 NuGet 包或任何东西,只有它们包含的文件。他们甚至没有编译它们包含的任何源文件所需的配置数据,如果共享项目未包含在某种完整的项目中,编译器也不会对内容进行太多验证。

由于共享项目无法指定引用或包,因此您需要将这些引用和包添加到链接到共享项目的每个项目中。如果你错过了,编译器会很快告诉你。

虽然在共享项目中有引用会很好,但事实证明它并没有您想象的那么简单。同一个共享项目可以包含在针对不同框架、平台和架构的项目中。假设您正在构建一些将在 ios、Mono、Windows .NET Framework 和 .NET Core 上运行的代码,其中包含每个目标的特定代码和一些共享代码。如果您尝试将 NuGet 依赖项添加到共享项目中,至少其中一个项目会在您面前炸毁。与大多数参考文献相同。添加 .NET Core 所需的所有引用,突然其他项目无法编译。

【讨论】:

感谢您的解释。我刚刚尝试并注意到,即使我没有向我的共享项目添加任何引用或 NuGet,我仍然可以从我的其他项目的引用中使用我需要的 API,这些项目引用了 shred 项目。这是否意味着共享项目本身没有任何引用,但它可以使用来自引用它的其他项目(共享项目)的所有引用的 API? 是的,因为共享项目已添加到完整项目中,它可以访问该项目中的所有其他内容,包括引用和包。共享项目中的代码所具有的任何依赖项(引用和包)必须由包含它的项目满足。【参考方案2】:

您需要在使用共享项目的项目中添加引用。

例如,假设您有引用“共享项目 B”的“项目 A”,并且您需要在“共享项目 B”中使用 Newtonsoft.Json。由于您无法添加对共享项目的引用,因此您将 Newtonsoft Nuget 包安装到Project A,您在“Shared Project B”中的代码将自动编译。

【讨论】:

以上是关于C# 在共享项目中使用引用/类库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET Core 类库中引用 Visual Studio 共享项目

C#控制台程序中怎样引用另一个项目中的类或结构

如何在两个项目共享的 xaml 文件中添加用户控件的引用

C#调用DLL问题

在C#的类库中可以创建WPF的窗口吗

C# 将共享项目中的类与许多项目集成