【问题标题】:Invoking an EXE in same Solution. Can it be a DLL instead?在同一解决方案中调用 EXE。它可以是一个DLL吗?
【发布时间】:2014-02-26 15:28:54
【问题描述】:

这完全超出了我的经验,如果这是一个愚蠢的问题,请原谅。我在谷歌上花了几个小时寻找这个问题的答案,但我找不到一个似乎直接适用于我的情况的答案。

我正在与一个拥有解决方案 XYZ 的小组合作。该解决方案有两个项目:XYZ 和 XYZOrchestrator。他们将两个项目中的 BIN 文件夹捆绑在一起,并将其部署到服务器上的一个文件夹中。 XYZOrchestrator 只计算它需要多少个 XYZ.exe 副本并分拆出每个调用 XYZ.exe 的多个线程:

private Process m_pProcess = new Process();
this.m_pNotify = pNotify;
ProcessStartInfo pInfo = new ProcessStartInfo("XYZ.exe");
pInfo.Arguments = m_pProcessId.ToString() + " " + m_pDataFile + " " +  m_pLogFile + " " + m_pReportFile + " " + m_pErrorFile;
pInfo.WindowStyle = ProcessWindowStyle.Hidden;

m_pProcess.StartInfo = pInfo;
m_pProcess.Start();

他们还引用了 XYZOrchestrator 中的 XYZ.exe,并像 DLL 一样调用 XYZ.exe 中的方法。所以我的问题是:可以将 XYZ.exe 构建为 DLL 吗?您可以使用 DLL 而不是 EXE 执行上述线程吗?如果我可以将其更改为 DLL,它将非常适合我们的构建/部署自动化模型。

【问题讨论】:

  • 将 XYZ 保留为 exe 并将 exe 作为参考包含在 XYZOrchestrator 解决方案中怎么样?
  • 这是我一直在研究的方法,但它会给我们的构建系统带来问题......

标签: c# windows dll invoke


【解决方案1】:

不,不可能运行 dll。为了清理结构,我将创建一个名为“XYZLib”的新程序集(dll),并将XYZXYZOrchestrator 共享的所有代码放在那里。那么依赖结构会更清晰。

【讨论】:

  • @Rotem,当然你也可以使用反射来做到这一点,但我想这些技术不会使它更透明和可维护(如果你当然可以控制源)。
  • @Grzenio - 没有共享代码。 XYZOrchestrator 的功能是从数据库中读取数据,并据此计算生成多少个 XYZ 副本来处理数据中的每个唯一案例。实际上很漂亮,但他们在 VS 中构建解决方案的方式给我带来了构建自动化问题......
【解决方案2】:

是的。基本上,如果你认为启动一个进程是用命令行参数调用 Main,你可以自己做,每次产生一个新线程。但请注意,您没有相同级别的隔离(异常处理、垃圾收集等)。您可能希望为每个实例创建一个新的 appdomain。

【讨论】:

  • 好的。所以我有一个否 (@Grzenio) 和一个是 (@Lev)。
  • 我上个月才这样做 - 采用了自托管 exe 中的服务并对其进行了更改,因此它是从另一个应用程序启动的。它的原始形式真的很简单: 1. 将服务编译为 DLL。 2. 只需在新生成的线程中从另一个程序调用服务的 Main() 函数。
  • @Lev,它是一个新线程而不是一个新进程。我确信他们需要单独的流程,否则他们不会引入所有这些编排。
  • 正如我所说,我建议为每个实例创建一个新的 appdomain。这非常接近进程级隔离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2012-07-15
  • 2023-03-08
相关资源
最近更新 更多