将.exe打包到.vsix并从Visual Studio扩展中调用

per*_*man 7 c# subprocess vsix visual-studio-extensions roslyn

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

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

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

看起来这可能是最好的方法,即使它似乎是hackish,在这种情况下,一旦我把一切都工作,我会发布这个作为答案.

Jas*_*ski 6

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

typeof(ExternalProcess).Assembly.Location
Run Code Online (Sandbox Code Playgroud)

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

关于这个的另一个好处是VSIX打包器应该自动将EXE包含到VSIX中,因为它是项目引用.您不必在.vsixmanifest中为EXE添加任何内容.