.NET Standard:依赖项未复制到输出目录

7
我正在将一个.NET Framework库转换为.NET Standard 2.0,因为我需要从旧的.NET Framework项目和现代的.NET 5项目中使用它。在原始库中,我使用了ProtectedData类,它是.NET Framework(来自System.Security.Cryptography程序集)的一部分。由于这不是基本的.NET Standard库的一部分,所以为了使其工作,我添加了适当的Nuget包System.Security.Cryptography.ProtectedData。有了这个包,项目可以正确编译,但是在我尝试运行时,我收到以下错误: System.IO.FileNotFoundException:“无法加载文件或程序集'System.Security.Cryptography.ProtectedData,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'或其某一个依赖项。系统找不到指定的文件。”所以我查看了编译输出目录,并且我发现没有System.Security.Cryptography.ProtectedData.DLL文件的痕迹,就好像编译系统没有将依赖项复制到输出目录。我该如何解决这个问题?

.csproj 文件中,你是否将所引用的 .dllCopy Local 属性设置为 True - Saggio
通常,这是由于VS引起的。如果编译良好但无法运行,则需要清理并重新构建您的解决方案。如果这不起作用,请启动一个新的VS和您的项目。 - Nikhil Agrawal
@Saggio:它不是本地DLL,而是一个NuGet包。 - Master_T
@NikhilAgrawal:尝试过了,没有成功。 - Master_T
2个回答

19

在另一个论坛上发现了这个答案,看起来可行。

我添加了:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

现在将其添加到.csproj文件中,现在依赖项正在正确地复制。

仍然希望有人解释为什么需要这样做,因为我以前从未对其他项目执行过此操作...


未来的读者请注意,在 .NET 标准项目的 csproj 文件中添加 <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> - Ryan Teh
我想我知道为什么会发生这种情况。因为它是一个.NET标准库,它不能独立运行,所以将依赖的DLL输出到库的输出目录中没有意义。如果您在可执行项目中引用此库,则会看到所有依赖项被输出(在exe项目的输出文件夹中)。 - Mayoor
我不确定你的解释是否正确 @Mayoor。我处于相同的情况,只是我正在处理一个可执行项目,除非我添加 CopyLocalLockFileAssemblies,否则传递依赖项不会被复制到项目的输出目录中。 - Simon Morgan

0

如果你被迫使用packages.config,那么被接受的答案不会奏效。

你可以打开详细的构建输出,以查看编译器未能将dll从packages文件夹复制到输出文件夹的位置。

为了解决这个问题,你需要在.csproj文件中添加一个带有HintPath的Reference,以便构建从packages文件夹中解析引用。

Include应该设置成编译器抱怨的路径。 HintPath应该设置成通过浏览packages文件夹找到的正确路径:

<Reference Include="'System.Security.Cryptography.ProtectedData, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'">
  <HintPath>..\packages\PathToDll</HintPath>
</Reference>

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