【问题标题】:Merging a c executable, managed COM dll, and .Net gui合并 c 可执行文件、托管 COM dll 和 .Net gui
【发布时间】:2018-03-17 16:24:40
【问题描述】:

packetlistener.exe:我有一个主动监听和接收数据包的 c 应用程序。

comwrapper.dll:包装非托管 c 可执行文件的 C++ COM dll

guiapp.exe:引用 comwrapper.dll 并使用它来显示信息和处理事件的 .NET gui。

我目前启动应用程序的方式:

  1. 使用命令行参数启动 packetlistener.exe。
  2. 启动guiapp.exe

在过去的几个小时里,我一直在试图弄清楚如何将它很好地打包到一个进程中。

我尝试将 packetlistener.exe 编译为 dll,然后将其包含在 guiapp 项目中。但是,对于将 packetlistener 作为 guiapp 的一部分启动,我完全迷失了。

我是 Windows 开发的新手,感觉自己做错了什么。 我是不是走错了路?

【问题讨论】:

  • 如果你有 C 程序的源代码,要么用它创建一个 DLL。为其编写一个 COM 接口,或将其嵌入到 C++/CLI 代码中并直接将其用作 .NET 程序集。但是你的问题是什么?只有一个可执行文件?直接使用代码没有单独的进程?
  • 我希望只有一个可执行文件而不需要两个单独的进程。 C 程序作为可执行文件运行,COM 接口能够查询它的数据并发送命令,但前提是可执行文件已经在运行。我可以将 C 应用程序转换为 DLL,然后从我的 C# 程序中启动它吗? c程序实际上是苹果开源的。 opensource.apple.com/source/mDNSResponder/…

标签: c# c++ .net dll com


【解决方案1】:

您可以使用 Process.Start 从 .net 应用程序启动进程:

Process.Start("packetlistener.exe", "-arg1 -arg2");

【讨论】:

  • 这是否需要将“packetlistener.exe”放在单独的文件中?是否可以将 packetlistener.exe 构建为 dll,然后使用 .net 启动它?
  • 是的。如果你使用 process.start,它需要是一个单独的 exe 在磁盘上。
  • 我刚刚完成了这个,它会打开一个单独的 cmd 提示符。我想知道如何将这些合并到一个应用程序中。
  • 有很多选项可以控制 Process.Start 的工作方式。阅读ProcessStartInfo 文档。您可以启动该过程而不显示窗口并将输出重定向到您的应用程序。如果您想尝试通过 COM 使用该库,您可以尝试,但 COM 确实增加了复杂性。
  • 我有一个与“packetlistener.exe”交互的 COM,但 COM 本身并没有启动它。这是主要问题。事实上 packetlistener.exe 曾经是我现在作为控制台应用程序运行的服务
【解决方案2】:

所以我最终弄清楚了我想做什么。

我将我的 C 应用程序编译成一个 DLL 并公开了一个可以启动它的函数。

然后我使用 PInvoke 在单独的线程中调用该函数,以便它可以开始收集和发送数据包。

COM DLL 似乎神奇地引用了在其自己的线程中运行的 C 程序。

现在由于我无法 PInvoke 嵌入的 DLL,我不得不将其解压缩到一个临时文件中,您可以在此处了解相关信息。

How can I extract a file from an embedded resource and save it to disk?.

最后我只剩下一个可执行文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2011-04-21
    • 2011-04-08
    相关资源
    最近更新 更多