以编程方式调用第二个Visual Studio项目

5
我正在使用Visual Studio 2010 Ultimate开发一个解决方案,其中包含两个C#项目:一个窗体项目和一个控制台项目。在程序上,它们是完全独立的;两个项目的主要部分都可以在没有另一个项目的情况下运行。我想做的是通过在窗体应用程序中按下一个按钮来调用控制台应用程序,并根据窗体应用程序设置特定的选项。因此,您可以将窗体应用程序视为仅仅是一个“启动器”应用程序。
我目前实现的方法是使用System.Diagnostics.Process.Start,第一个参数为“cmd”,第二个参数为控制台应用程序的可执行文件路径(加上CLI参数)。但这是一个可怕的解决方案,因为当部署到其他机器上时,它会崩溃。
我还尝试在Forms对象中创建对控制台项目的引用,使控制台项目中的Program公共和静态,并调用控制台项目的Main方法,但由于没有有效的输出句柄,这最终会导致异常被抛出。
我已经在Google上搜索了很多,也在SO上搜索了一些,并甚至检查了提交页面上的“类似问题”,但似乎没有人知道如何做我想做的事情。有什么指针可以让我走上正确的轨道吗?
FYI:我知道可能有十万种更好的方法来做这件事,但我有几个原因需要并需要以这种方式完成。我知道我可以只是为CLI程序制作一个单独的GUI,并复制相关代码,或将所有内容合并到一个项目中并创建一个单独的输出窗口,或其他类似的解决方案。但我需要这个解决方案有两个原因:(1)我有一个相当复杂的CLI程序,它作为CLI程序运行良好,现在需要一种用户友好的方式来启动它,(2)用其他方式解决问题并不回答“为什么要在同一个解决方案中有几个可执行项目,如果不能从另一个项目调用其中一个?”这个问题。
1个回答

5

你的做法很好,只需要稍微调整一下。

首先,在启动时,不要将cmd作为参数与你的可执行文件一起运行,而是直接运行控制台应用程序myapp.exe作为Process.Start中的命令。

下一步是让你的应用程序从安装的任何地方运行。最简单的方法是将两个可执行文件并排部署在同一个文件夹中。使用Application.StartupPath查找Forms应用程序启动的文件夹(也就是另一个应用程序所在的位置)。使用Path.Combine(Path.GetDirectory(Application.StartupPath), "myapp.exe")生成要运行的exe的完整路径名。

另一种选择是使用安装程序,然后将其他应用程序的位置存储在已知位置(例如注册表键)中,但这会增加复杂性,而收益却很小(除非您需要安装程序进行其他操作)。


啊!微软为什么不能把事情做得更简单一些呢?非常感谢您的答案和建议。 - Mrrvomun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接