从 C 调用 C++ exe 函数#

Calling C++ exe functions from C#

提问人:Luchian Grigore 提问时间:10/6/2011 更新时间:10/6/2011 访问量:4151

问:

我正在尝试使用不同的 C# 应用程序监视用 C++ 编写的正在运行的应用程序。

在我的 C++ 代码中,我定义了一个 API:

_declspec(dllexport) //is this even possible when compiling an .exe?
int  getSomething();

有没有办法从 C# 代码调用此函数?

经典方法是否有效:

[DllImport("myexe.exe", CharSet = CharSet.Auto)]
public static extern int  getSomething();
C# C++

评论

1赞 GolezTrol 10/6/2011
回答第一个子问题:是的,可执行文件可以具有导出的函数。
3赞 Yaur 10/6/2011
不过,为了澄清起见,您将把模块加载到您自己的进程中,而不是挂接到您尝试监视的“正在运行的应用程序”中。为此,您将需要某种 IPC。
0赞 Luchian Grigore 10/6/2011
@Yaur是的,IPC就是我一直在寻找的。经过一番潜伏,我意识到没有IPC,我想要的东西是不可能的。

答:

5赞 Polynomial 10/6/2011 #1

是的,任何 PE 可执行文件都可以以这种方式导出函数。请记住,编译器有时会破坏导出名称,从而产生如下结果:

MyAPIFunction@16

您可以通过将可执行文件加载到 PEInfo 等工具中来检查名称是否正常。

您应该能够以与 DLL 中的函数完全相同的方式调用它。

更新好的,所以看起来你想要 IPC,而不是 P/Invoke 调用。有关如何在 C# 中使用命名管道的信息,请参阅此页面这里是开始寻找有关如何在 C++ 中使用命名管道的信息的好地方。

评论

0赞 Luchian Grigore 10/6/2011
例如,调用集合函数是否会更改 C++ 进程中的相应变量?
0赞 Polynomial 10/6/2011
哈哈你是在调用方的上下文中调用函数,而不是在另一个进程的上下文中调用函数。它将二进制映像映射到 .NET 进程的虚拟内存中,并对指定函数的地址执行 P/Invoke 调用。一切都发生在 .NET 进程中,就像它是您正在加载的 DLL 一样。我认为您正在寻找在另一个正在运行的进程中执行操作的解决方案。如果是这种情况,则需要进程间通信机制。有几种方法可以做到这一点,但命名管道和插座通常是最好的选择。
0赞 Luchian Grigore 10/6/2011
是的,这正是我想做的。我想避免进程间的交流,但显然没有其他方法(这是有道理的,这就是我问这个问题的原因)。尽管如此,还是感谢您的回答。
0赞 JoeG 10/6/2011 #2

是的,您可以从 a 导出函数,就像从 a 导出函数一样,您展示的方式是正确的方法。.exe.dll

不,您不能通过这样做与现有进程进行交互,就像从 加载函数不允许您使用该函数与其他进程进行交互一样。.dll.dll