c# - VS 项目可执行文件的最终位置

标签 c# visual-studio vs-extensibility

我正在编写一个 Visual Studio 扩展,我需要知道最终用户项目的每个项目的可执行文件的最终位置。假设我专门针对 C# 桌面应用程序,因此它们应该使用 MSBuild。这通常相当简单,但一些最终用户项目可能非常复杂。简单的答案是查询每个项目的 DTE 并获取它们的 OutputPath。有时,事情并不是那么简单。这是一个不起作用的示例:

  • 一些解决方案包含三个项目:MainPlugin1Plugin2

  • Main 项目使用标准输出路径。

  • Plugin1Plugin2 项目在构建后通过 Copy 复制到 plugins 文件夹各自项目文件中的 AfterBuild 指令。

  • 用户运行 Main 项目并在运行时告诉它他们需要哪个插件。

  • Main 项目使用该信息动态加载所选插件。

请注意,这意味着选定的 DLL 不会在 Main 可执行文件中显示为引用。如果是,我可以找到一种方法来检索该信息,但它们是动态计算的。我需要在执行前知道这些信息。

我遇到的主要问题是我没有可靠的方法来检索插件的“最终输出路径”(项目文件中 AfterBuild 指令的结果),并且这才是我真正需要知道的。不幸的是,我不能只更改项目文件,因为此扩展需要尽可能多地使用 VS 解决方案。

更新:我尝试过 MSBuild API,结合使用自定义记录器和 FileWrites 变量,但我找不到提取此信息的方法。不幸的是,FileWrites 不保存Copy 操作的结果。除非有人提出更好的解决方案,否则我只会爬取所有“匹配”目标(大小、时间戳、内容等)的文件的解决方案树。诚然,这是一种 hack,但我没有看到更好的方法。

最佳答案

在我看来,您有以下选择:

  1. 您可能会将 dll 放入 vsix 文件中 see here这是一个 zip 文件。您可以从您的入口点(即 main 方法)使用反射,然后您可以找到您的主要方法可执行位置(即 exe、dll 等)。如果它显示在 vsix 路径中,那么您就知道您的 vsix 位置并可以加载与该位置相关的其他 dll。

  2. 您可以根据需要下载 dll 来解决您的问题 see here使用像 MEF 或 MAF 这样的框架 see here .这样你就不需要知道位置了。您还可以选择将下载的 dll 单独存储或作为资源等存储在您的 dll 的一部分中。(您的选择)

对于这两个选项,您最终会在新的 dll 中创建接口(interface),这些接口(interface)将被插件和您的主项目引用。这将使您能够确定不同的项目。没有什么是接口(interface)不能实际表示的,因为您甚至可以将函数调用放回那里。

关于c# - VS 项目可执行文件的最终位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48757708/

相关文章:

c# - 集成使用 SSL 连接机器的 API

c# - 将 blob 转换回原始文件类型并使其可供下载

visual-studio - "Visual Studio 16 2019"停止使用 GitHub Actions

automated-tests - 解决 Visual Studio 运行自定义测试类型时的 FileNotFound 问题

visual-studio-2010 - 扩展 Visual Studio 的 "Code Snippet"功能

visual-studio-addins - 如何将自定义项目模板和向导集成到 Visual Studio 包中?

javascript - 如何将javascript变量传递给服务器端asp.net

c# - 从字节数组中解析短值(蓝牙)

c - 在 Ubuntu 上安装的 TeamCity 服务器上构建 Visual Studio 项目

c++ - 我可以将 C++ App 的 VS2005 解决方案导入 IDE 以在 Linux 上进行调试吗?