不复制引用的库

时间:2011-09-05 09:06:56

标签: c# .net msbuild reference

我有 ProjectA(WPFApplication),它引用了 ProjectB(ClassLibrary)。 在 ProjectB 内部,我有一个wpf窗口,它使用来自 ThirdParty.dll 的控件,因此我从 ProjectB 引用。

问题是它在 ProjectA 的输出文件夹中找不到 ThirdParty.dll ,并且引发了xaml解析运行时exceprion。 GAC中没有 ThirdParty.dll 。 “本地复制”设置为true。 它可以工作,如果我手动添加 ProjectA 的输出文件夹该库,如果我在我的cs文件中使用 ThirdParty.dll somwhere它也可以。

我该如何解决?

3 个答案:

答案 0 :(得分:5)

原因是如果设置了“复制本地”,Visual Studio仅将资源复制到输出文件夹。只需将引用设置为Copy Local就可以了。

请查看此link,了解其工作原理。

引用ProjectA时,不会自动引用ProjectB的引用。为此,您需要在ProjectA中添加对ThirdParty.dll的引用,如果您只在XAML中使用它。编译器不会复制仅在XAML中使用的引用。但是如果你在代码中使用它们,它们就会被复制。

这与讨论here

时的问题相同

答案 1 :(得分:1)

您应该将对第三方dll的引用添加到您希望它出现在输出目录中的项目中。如果Copy Local设置为true,它将显示在您的bin目录中,无论您是否在代码或xaml中使用它。

答案 2 :(得分:0)

将此类内容添加到 ProjectB.csproj

<ItemGroup>
   <Content Include="...\path\ThirdParty.dll">
      <Link>ThirdParty.dll</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
   </Content>
</ItemGroup>

这说服VS将 ThirdParty.dll 复制到 ProjectA 的输出文件夹中 (无需向 ProjectA 添加任何关于 ThirdParty.dll 的内容。)
我仍然认为它不合适,因为如果 ThirdParty.dll 在NuGet包中,其路径通常包含版本号,更新包时会更改版本号。
我还没有尝试过,但我不希望NuGet像<Reference>一样更新路径。