C# 在另一个项目中引用项目会创建不需要的依赖项

C# 在另一个项目中引用项目会创建不需要的依赖项,c#,reference,projects-and-solutions,C#,Reference,Projects And Solutions,我有一个项目ProjectA,我在其中保存实用程序类。我想在多个解决方案中使用此项目,这样我就不必在每次更改project的类时复制文件、链接文件和更新文件 但似乎有一个问题:如果我在ProjectB中引用ProjectA,则ProjectB的编译应用程序无法运行,除非它旁边有一个来自ProjectA的编译应用程序。因此,如果ProjectB的输出是ProjectB.exe,如果ProjectA.exe不在ProjectB.exe旁边,则ProjectB.exe在执行时会给出一个错误。为什么呢?

我有一个项目
ProjectA
,我在其中保存实用程序类。我想在多个解决方案中使用此项目,这样我就不必在每次更改
project
的类时复制文件、链接文件和更新文件

但似乎有一个问题:如果我在
ProjectB
中引用
ProjectA
,则
ProjectB
的编译应用程序无法运行,除非它旁边有一个来自
ProjectA
的编译应用程序。因此,如果
ProjectB
的输出是ProjectB.exe,如果ProjectA.exe不在ProjectB.exe旁边,则ProjectB.exe在执行时会给出一个错误。为什么呢?我只想在
ProjectB
中使用
ProjectA
中的名称空间,我不需要
ProjectA
依赖于
ProjectB
的编译版本


有人能告诉我如何在
ProjectB
中引用
ProjectA
,而不需要
ProjectA
的输出来运行
ProjectB
的输出吗?

在这种情况下,在bin文件夹中添加
ProjectA
编译的dll,并从其他项目添加对该dll的引用。不要添加对
项目a
项目的引用


使用Visual studio向项目添加引用时,请添加引用->项目,然后需要编译项目,并将dll/exe复制到另一个项目bin文件夹

在文本编辑器中打开您的csproj文件并插入xml:

<Reference Include="AssemblyName.dll">
  <HintPath>$(EnvironmentVariable)\bin\AssemblyName.dll</HintPath>
  <Private>False</Private>
</Reference>

$(环境变量)\bin\AssemblyName.dll
假的

名称空间不限于一个程序集-如果愿意,可以跨多个程序集使用相同的名称空间,并且一个程序集可以包含任意多个名称空间


如果正在引用另一个程序集的类/类型,则运行原始程序集时该程序集必须存在(或可定位)。如果你所做的只是编码,那么一个简单的方法就可以了。如果您没有用于投影A的源代码,那么您将需要它的编译形式-没有它,CLR无法检查它并知道它包含什么。

如果我理解正确,您在ProjectA.exe中有代码,您希望在ProjectB.exe中使用,但在运行时,您希望运行ProjectB.exe而不要求用户拥有ProjectA.exe的副本

这是不可能的。当您使用来自另一个程序集的类型时,该程序集将在运行时加载。该类型不会从ProjectA复制到ProjectB

在我看来,您应该将公共实用程序类提取到ProjectUtility.dll中,然后从ProjectA.exe和ProjectB.exe应用程序中引用它


编辑:ILMERGE可能是一个不错的选择。有关更多信息,请参阅。

您可能需要一个共享dll

您已经在项目A中创建了实用程序类,因为它们在项目A(应用程序A?)中共享,现在您已经引入了项目B(应用程序B),并且正如您所说的,它需要从projectA.dll/exe获得代码

因此,在您的解决方案中创建一个新项目(Ab.Shared.dll可能:-),并将您的实用性类移到其中。现在可以从项目A和项目B引用该dll

更新:请阅读您关于吸吮代码的评论


共享dll是共享有关的代码的最常见的方式,但还有其他方式。理论上,您可以简单地在两个项目中“包含”相同的*.cs文件,并以这种方式共享它们(使用“添加现有项”对话框上的下拉菜单,然后选择“添加为链接”)。然而,在实践中,维护此场景会变得更加尴尬,因此大多数人使用共享dll。

我之所以引用
ProjectA
是因为
ProjectB
可以立即看到
ProjectA
中的更改,如果我更新
ProjectA
中的名称空间,重构也会在
ProjectB
中更新它们,我相信如果我添加已编译的dll或
ProjectA
,这是不可能的。此外,我将依赖于该dll。编译
ProjectB
时,是否有办法让
ProjectB
ProjectA
中吸取代码?对于问题的第一部分,您必须添加对项目的引用,并且项目本身也应该能够编译。对于问题的第二部分,我不确定是否可以将多个DLL合并到一个项目中,但我不认为您可以从visual studio
ProjectA
中实现这一点,仅此而已。我不打算将其输出到dll或exe,我只想在其中组织代码,并从其他项目(我打算编译为exe或dll)访问它。我以前的做法是将.cs文件从
ProjectA
链接到
ProjectB
,但这很难维护,因为每当我更改名称空间或源.cs文件位置时,它都需要更新。@IneedHelp项目确实创建了dll或exe,正如您所发现的那样。我所知道的做您想要做的事情的唯一其他方法是使用您先前链接文件的方法。分离公共代码的常用方法是将其保存在库中(这毕竟是“dll”中的第二个“l”所代表的)。@IneedHelp显然可以在编译后使用ILMERGE合并两个程序集。看到这个答案(尽管它很旧,可能已经过时):非常感谢您的支持。似乎我只需要使用一个文件夹,就像阿尔斯基建议的那样。因此,我在每个项目中创建一个指向共享文件夹的符号链接。
ProjectA
是一个完整的实用程序项目,因此我使用它只是为了跟踪共享代码,并更轻松地更新共享代码。只有
ProjectB
实际输出dll/exe。我基本上想要的是
ProjectB
在编译时从
ProjectA
中吸取代码,而不依赖于编译后的dll/exe o