引用另一个项目中的项目会产生不需要的依赖项

时间:2012-09-11 09:02:08

标签: c# reference projects-and-solutions

我有一个项目ProjectA,我在其中保留实用程序类。我希望在多个解决方案中使用此项目,因此每次在Project的类中进行更改时,我都不必复制文件,链接文件和更新文件。

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

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

5 个答案:

答案 0 :(得分:1)

命名空间不限于一个程序集 - 如果愿意,可以在多个程序集中使用相同的命名空间,并且一个程序集可以包含任意数量的命名空间。

如果从其他程序集引用类/类型,则在运行原始程序集时该程序集必须存在(或可定位)。如果你所做的只是编码,那么一个简单的project reference in your solution就能解决问题。如果你没有Project A的源代码,那么你将需要它的编译形式 - 如果没有它,CLR就无法检查它并知道它包含的内容。

答案 1 :(得分:1)

您可能需要共享的dll。

您已在项目A中创建了实用程序类,因为它们在项目A(应用程序A?)之间共享,现在您已经引入了项目B(应用程序B),并且当您声明需要从projectA获取代码时.dll文件/ exe文件。

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

更新:只需阅读有关吸取代码的评论。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

听起来我应该将常用的实用程序类提取到ProjectUtility.dll中,然后从ProjectA.exe和ProjectB.exe应用程序中引用它。

编辑:ILMERGE可能是要走的路。有关详细信息,请参阅Linking statically in C#