【问题标题】:Package .exe into .vsix and call from Visual Studio extension将 .exe 打包到 .vsix 并从 Visual Studio 扩展调用
【发布时间】:2012-02-08 00:26:06
【问题描述】:

我有一个 Visual Studio 包,它通过启动一个外部进程(使用System.Diagnostics.Process)并通过标准输入/输出与其通信来完成它的一些工作。目前,我有通往.exe 硬编码的路径,这显然不适用于实际部署扩展。使用扩展名打包和分发.exe 的正确方法是什么? (而且,相关的,一旦我这样做了,我如何以编程方式发现已安装的.exe 文件的路径。)最好将其放入.vsix 文件中,以便安装。

编辑:我已将我的代码的相关部分放在 BitBucket 上(它可能对使用 Roslyn 的其他人有用):roslyn_process 以便更好地了解我正在尝试的内容去做。此代码使用AbstractProcessHandler 的实现设置Visual Studio 扩展与使用RoslynProcess 的单独进程之间的通信。后者会随时了解对 Visual Studio 中代码文件的修改以及正在查看哪个代码文件,因此它能够使用最新信息进行分析,尽管它不是作为 Visual Studio 扩展运行的,这会施加以下限制Roslyn 关于正在编辑的所有代码。

编辑2:使用this answer,我可以得到扩展的目录。我可以在source.extension.vsixmanifest 中包含另一个包,方法是将其作为“自定义扩展类型”类型添加到内容列表中。然后.exe 出现在扩展的目录中。这似乎是正确的解决方案,尽管获取目录的方式在 MSDN 中被标记为我不应该使用的东西。

看起来这可能是最好的方法,即使它看起来很老套,在这种情况下,一旦我一切正常,我会发布这个作为答案。

【问题讨论】:

  • @Kiquenet:抱歉,我没有一个简洁的最小解决方案......但公认的答案是单行的。

标签: c# subprocess vsix visual-studio-extensions roslyn


【解决方案1】:

最简单的方法之一是让您的包 DLL 具有对 EXE 的项目引用,并使您的入口点类(或 EXE 中的某个类)公开。然后你可以写:

typeof(ExternalProcess).Assembly.Location

它为您提供了扩展路径中 EXE 的路径。

这方面的另一个好处是 VSIX 打包程序应该自动将 EXE 包含到 VSIX 中,因为它是一个项目引用。您无需在 EXE 的 .vsixmanifest 中添加任何内容。

【讨论】:

  • 因为当我尝试这个:包含一个 EXE(引用 NancyFX)时,它告诉我 NancyFX 没有强命名,并且构建失败。
  • “它”是什么?无论如何,在这里开始另一个问题比就这个问题进行对话更合适。
  • 我没有问题——我有一个警告:当您使用 VS 2012 SDK 创建 VSPackage 时,模板会创建一个启用强命名的项目。如果您引用该项目中的其他任何内容,则需要对其进行强命名,因为强命名具有传递性。
  • 当然。尽管 VSPackages 经常存在混淆:它们根本不必是强名称签名的,只是默认模板(诚然是一个糟糕的模板)默认设置它。
  • 您如何拥有对 .exe 的项目引用?你写的sn-p代码中的ExternalProcess是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2011-04-17
相关资源
最近更新 更多