Visual Studio 个项目将引用项目中的依赖项复制到输出中

Visual Studio projects copy dependencies from referenced project into output

是否可以Visual Studio将引用项目的所有依赖项复制到输出路径中?

例子

在解决方案中,项目A(库,.NET Standard)定义了一些函数并且依赖于库L1(通过NuGet)和库L2(本地.dll,引用并复制到项目)

项目 B(控制台应用程序)引用项目 A。

构建 B 时,输出文件夹包含 B 和 A.dll 的所有直接依赖项。 L1 和 L2 在输出中不可用。因此,该程序无法正常运行。

如何强制 VS 也将 L1 和 L2 复制到 B 的输出?

到目前为止我发现的唯一方法是将 A 打包为 NuGet,但这似乎是不必要的开销并且令人不舒服。我想我只是忘记了其他人似乎都知道的事情...

编辑(澄清示例)

我的解决方案包含两个项目。

MongoWrapper 项目

项目控制台用户

观察

调试 ConsoleUser 应用程序时,它会编译并启动。在运行时,当它调用 MongoWrapper 中使用 MongoDB.Driver 的方法时,应用程序崩溃,因为 MongoDB.Driver 依赖项未复制到 ConsoleUser 的输出文件夹中.

如何解决这个问题?

Is it possible to make Visual Studio to copy all dependencies of referenced projects into the output path?

是。

这就是 publishing the application 所做的 - 它准备应用程序以进行部署。发布时,它将在输出中包含应用程序 运行 所需的所有依赖项。

Use the Publish tool to deploy to a local folder. The exact options available depend on your app type. In Solution Explorer, right-click your project and choose Publish, and then choose Folder. For more information, see Deploy to a local folder.

教程:Publish your Hello World application with Visual Studio 2017

另见:.NET Core application deployment.

问题是由 .Net Standard 库和 .Net Framework 应用程序的使用引起的。

TLDR

使用文本编辑器打开.Net Framework 项目的.csproj 文件。在第一个 PropertyGroup 内添加行

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

保存文件,在 Visual Studio 中重新打开 Solution 并执行 Clean & Build

不同项目文件版本的依赖关系

.Net Framework 项目使用旧版本的 .csproj 项目文件。 References/Dependencies 存储在附加的 packages.config 文件中。默认情况下,构建 .Net Framework 项目会使系统在引用的项目中搜索 packages.config 文件。如果找不到这样的文件,构建任务会将引用的项目视为没有依赖项。因此,在示例中,没有添加MongoDB.Driver库。

通过在 .csproj 项目文件中添加建议的行,构建任务会在引用项目的项目文件中搜索依赖项,它们存储在 .Net 标准项目文件中。

.Net Core 项目默认搜索较新的项目文件结构。

可以在选项 -> NuGet -> 常规 -> 包管理中设置新项目的默认行为