【问题标题】:How to F5 deploy with add-in libraries in Visual Studio?如何在 Visual Studio 中使用加载项库进行 F5 部署?
【发布时间】:2017-10-24 08:28:56
【问题描述】:

我维护一个应用程序,其中包含它所依赖的一些项目引用。此外,在同一解决方案中有一些“插件”项目不需要编译应用程序,而是在运行时加载。然而,“加载项”项目对于应用程序的工作至关重要。也就是说,它们是强制插件。

我的团队将始终能够使用 Visual Studio 启动应用程序,并根据需要进行增量构建,并将加载项库部署到应用程序。

加载项项目不与应用程序项目共享其输出目录,因为加载项项目是 AnyCPU,而应用程序是为 x86 和 x64 平台构建的。

我犹豫是否要简单地将 P2P 引用添加到加载项项目。没有 P2P 引用不仅是传达这些项目的插件特性的好方法,还有助于 IntelliSense 不会变得不堪重负。

我尝试use P2P references with ReferenceOutputAssembly set to false,但这似乎不支持 Visual Studio 中的增量构建。

那么,在存在上述现实世界限制的情况下,我如何才能提供令人满意的 F5 体验?

【问题讨论】:

    标签: .net visual-studio reference msbuild project


    【解决方案1】:

    使用将ReferenceOutputAssembly 设置为false 的P2P 引用,但请考虑以下陷阱:

    • 由于现在 Visual Studio 2017 版本 15.4.2 及更早版本,快速更新检查不支持此功能。因此,通过在应用程序项目中将DisableFastUpToDateCheck 属性设置为true 来禁用检查,如the docs 中所述。这可能会大大增加构建时间。
    • 不要在项目引用中指定CopyToOutputDirectory元数据,以防应用程序和引用项目的输出目录重合。否则,这会阻止 Rebuild 目标。

    【讨论】:

      【解决方案2】:

      那么,在存在上述现实世界限制的情况下,我如何才能提供令人满意的 F5 体验?

      如果我理解你的话,恐怕你进入了误区。使用 P2P 引用并将 ReferenceOutputAssembly 设置为 false,Visual Studio/MSBuild 不会将该引用库复制到引用项目的输出,但仍会编译引用的项目。

      如果您不想在同一个解决方案中编译那些“插件”项目,而是在运行时加载它们,您可以直接引用这些“插件”项目的.dll 文件。或者,您可以使用 NuGet 打包您的库程序集。然后,您可以在 Visual Studio 中使用 NuGet 来处理所有这些引用。在这种情况下,“加载项”项目不会编译,而是在运行时加载。

      如果您只是不想将那些“插件”项目的库复制到输出目录以供参考项目,您可以将这些引用的属性“Copy Local”设置为false。

      评论更新:

      我想在同一个解决方案中开发“加载项”项目。您是否建议不要使用此工作流程?

      简单的答案是肯定的。如果您在同一解决方案中开发“加载项”项目,当您对引用的项目进行任何修改时,引用项目将被重新编译,这将破坏您之前的部署。 所以我不建议在同一个解决方案中开发“加载项”项目,您可以将其移动到新的解决方案中。如果您仍想在同一个解决方案中开发这些项目,您可以参考我之前的建议“使用 NuGet 打包您的库程序集。然后您可以在 Visual Studio 中使用 NuGet 来处理所有这些引用。”。在这种情况下,开发插件项目时不会破坏之前的部署。

      希望这会有所帮助。

      【讨论】:

      • 感谢您的解释。将ReferenceOutputAssembly 设置为false 具有不链接到项目的效果。为了复制它,必须指定两个额外的元数据,正如我在问题中提到的博客条目中所解释的那样。但是,如果我在附加项目中更改某些内容,它将被编译但不会被复制。
      • 我想在同一个解决方案中开发“加载项”项目。您是否建议不要使用此工作流程?
      • @tm1,我已经为您的评论更新了我的答案,您可以检查它是否能给您一些帮助。如果是,您可以将其标记为答案,这样可以帮助遇到相同问题的其他社区成员。如果没有,请免费告诉我,我会继续关注。
      • 我修改了问题以更好地描述插件项目的性质,这可能更好地表明希望在与主项目相同的解决方案中开发它们。
      • 如果需要在同一个解决方案中开发“加载项”,我可以考虑用 NuGet 打包你的库程序集。
      【解决方案3】:

      只需在各处使用 P2P 引用即可使其发挥作用。也就是说,比起没有直接引用“加载项”项目的装饰,更喜欢工作构建系统。

      【讨论】:

      • 感谢您在这里分享您的解决方案,您可以将其标记为答案,这样可以帮助遇到相同问题的其他社区成员。
      • @Leo-MSFT 我想根据社区反馈标记答案。就目前而言,this 答案对我来说很好,但其他人可能有不同的经历。
      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2011-06-10
      相关资源
      最近更新 更多