提问人:Luchian Grigore 提问时间:10/6/2011 更新时间:10/6/2011 访问量:4151
从 C 调用 C++ exe 函数#
Calling C++ exe functions from C#
问:
我正在尝试使用不同的 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();
答:
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
评论