【问题标题】:How should I call a .NET exe that is distributed with my main application我应该如何调用与我的主应用程序一起分发的 .NET exe
【发布时间】:2009-09-08 08:22:24
【问题描述】:

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

正在考虑的选项:

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

如果您有任何其他方法可以实现我的目标,我将不胜感激。

谢谢!

【问题讨论】:

  • 您是在谈论在开发模式下运行(即从 Visual Studio),还是在谈论部署后?从你的问题的措辞来看并不完全清楚。
  • 部署后我需要运行它

标签: c# .net visual-studio reference executable


【解决方案1】:

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

  • 作为一个单独的进程:使用System.Diagnostics.Process 并将任何信息作为命令行参数传递
  • 在同一进程中,使用普通的 .NET 方法调用
  • 在同一进程中单独AppDomain

这两个都可以正常工作;在第一个版本中,您根本不需要主项目来引用 exe:只需将其包含在您的设置/部署项目中,如果有的话。如果您使用的是 xcopy 部署(即只获取输出目录的内容),那么您可以添加对 exe 的引用来复制它。

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

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

【讨论】:

  • 谢谢乔恩。一个非常完整和有用的答案!
  • @Jon:第一个陈述(“两种不同的方式”)与您列出的实际方式数量冲突。
【解决方案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 文件以使其更小。这将在运行该过程之前增加一个解压缩存档的步骤。

【讨论】:

  • +1 如果重要的是让最终用户更难直接运行(甚至知道)第二个可执行文件,这是最好的选择。乔恩的回答中提到的选项没有实现这一点。
【解决方案3】:

您也可以将其设置为 Dll 程序集并从您的应用程序中调用它,我的意思是在运行时加载程序集(如果它存在的话)。

【讨论】:

  • 您无需将其设为 DLL 即可将其用作参考。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2022-07-18
    相关资源
    最近更新 更多