2009-09-08 23 views
1

我有一个.NET Windows应用程序需要调用另一个.NET可执行文件。我想分发这个其他exe文件作为主要项目的一部分,并且想知道实现这个的最佳方式是什么。我们不希望从第二个exe文件中获取代码并将其放入主项目中,因为我们需要将exe有效保持密封状态,因为我们也将其分发给第三方。我该如何调用与我的主应用程序分发的.NET EXE

选项考虑:

  1. 我应该加上EXE作为项目中的文件和设置复制到输出为“始终复制”,然后就从主应用程序文件夹中运行呢?
  2. 我应该在主项目中添加exe作为参考吗?如果我这样做,我将如何将它作为一个带参数的可执行文件调用?

对于上述方法的一些指导,以及实际上如果您有其他方法来实现我的目标,我将不胜感激。

谢谢!

+0

您是在讨论在开发模式(即从Visual Studio)中运行时,还是在您部署它时讨论过?从你的问题的措辞不完全清楚。 – 2009-09-08 08:32:19

+0

我需要在部署后运行它 – JamesW 2009-09-08 08:34:35

回答

5

中有EXE文件执行的代码的两种不同的方式:

  • 作为一个独立的过程:使用System.Diagnostics.Process并传递任何信息作为命令行参数
  • 在相同的处理,使用正常的.NET方法调用
  • 以相同的过程在分开的AppDomain

这两种WO很好;在第一个版本中,您根本不需要主要项目来引用该exe文件:只要将它包含在安装/部署项目中(如果有)。如果您使用的是xcopy部署(即只是输出输出目录的内容),那么您可以添加一个对exe的引用,以便复制它。

要使用第二种形式你需要在你的项目添加到exe文件的引用。如果您很高兴在进程中调用代码,这可能是最简单的解决方案。

第三种形式可以使用引用,但不是必须的。这比第二种选择给予更多的隔离,但比第一种更少。

+0

谢谢乔恩。一个非常完整和有用的答案! – JamesW 2009-09-08 08:38:20

+0

@Jon:第一条语句(“两种不同的方式”)与您列出的实际数量冲突。 – 2009-09-08 08:50:24

0

你也可以把它作为DLL程序集,并从您的应用程序调用它,我的意思是在运行时加载的组件,如果它的存在。

+1

您不需要将它作为DLL来将其用作参考。 – 2009-09-08 08:29:16

0

添加对该exe文件的引用将无济于事,除非您想使用您的主程序中的exe类。我想你的第一个选择是最好的

2

复制到输出是,当然,最简单的解决方案。

如果你不希望有此exe与您的应用程序文件在了一起挂,把它的资源,当你的应用程序需要运行的exe,只需将其保存到临时文件夹并从那里运行。

这里的验证的概念代码:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fileName = Path.ChangeExtension(Path.GetTempFileName(), "exe"); 
     File.WriteAllBytes(fileName, Resources.QueryExpress); 
     var queryAnalyzer = Process.Start(fileName); 
     queryAnalyzer.WaitForExit(); 
    } 
} 

在项目属性中去的资源和拖放在那里,你的exe文件。本示例使用名为的应用程序QueryExpress.exe

你也可能希望压缩你的应用程序到ZIP文件,使其更小。这将在运行该过程之前再添加一个步骤来解压缩存档。

+0

+1如果最终用户难以直接运行(甚至不知道)第二个可执行文件,这是最好的选择。乔恩的答案中提到的选项没有达到此目的。 – Ash 2009-09-08 09:03:34

相关问题