Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用C++;来自C的exe函数# 我尝试用不同的C++应用程序来监控C++中运行的应用程序。 我在C++代码中定义了一个API: _declspec(dllexport) //is this even possible when compiling an .exe? int getSomething();_C#_C++ - Fatal编程技术网

C# 调用C++;来自C的exe函数# 我尝试用不同的C++应用程序来监控C++中运行的应用程序。 我在C++代码中定义了一个API: _declspec(dllexport) //is this even possible when compiling an .exe? int getSomething();

C# 调用C++;来自C的exe函数# 我尝试用不同的C++应用程序来监控C++中运行的应用程序。 我在C++代码中定义了一个API: _declspec(dllexport) //is this even possible when compiling an .exe? int getSomething();,c#,c++,C#,C++,有没有办法从C代码调用这个函数 经典方法是否有效: [DllImport("myexe.exe", CharSet = CharSet.Auto)] public static extern int getSomething(); 是的,任何PE可执行文件都可以这样导出函数。请记住,编译器有时会损坏导出名称,导致如下情况: MyAPIFunction@16 通过将可执行文件加载到工具(如)中,可以检查名称是否正确 您应该能够以与DLL中的函数完全相同的方式调用它 更新 好的,看起来您需要的

有没有办法从C代码调用这个函数

经典方法是否有效:

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

是的,任何PE可执行文件都可以这样导出函数。请记住,编译器有时会损坏导出名称,导致如下情况:

MyAPIFunction@16
通过将可执行文件加载到工具(如)中,可以检查名称是否正确

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

更新
好的,看起来您需要的是IPC,而不是P/Invoke调用。有关如何在C#中使用命名管道的信息,请参见。这是一个很好的地方开始寻找如何在C++中使用命名管道的信息。

< P>是的,你可以从<代码> exe < />代码中导出函数,就像你可以从<代码> .dll < />代码中所示。
不,您不能通过这样做与现有进程交互,正如从
.dll
加载函数不允许您使用该
.dll

与其他进程交互来回答第一个子问题:是,可执行文件可以有导出的函数。为了澄清,您将把模块加载到自己的进程中,而不是挂接到您试图监视的“正在运行的应用程序”中。要做到这一点,你需要某种IPC。@是的,IPC就是我要找的。在一些潜伏之后,我意识到我想要的是没有IPC的不可能。例如,调用一个SET函数来改变C++进程中的各个变量?不,你在调用方的上下文中调用函数,而不是在另一个进程的上下文中调用函数。它将二进制映像映射到.NET进程的虚拟内存中,并对指定函数的地址执行P/Invoke调用。一切都发生在.NET进程中,就像您正在加载的DLL一样。我认为您正在寻找在另一个正在运行的流程中执行操作的解决方案。如果是这样,您需要一个进程间通信机制。有几种方法可以做到这一点,但是命名管道和套接字通常是最好的选择。是的,这正是我想要做的。我想避免进程间的通信,但显然没有其他方法(这是有道理的,这就是我提出这个问题的原因)。谢谢你的回答。