如何在另一个进程中从c#调用c++导出函数

How to call a C++ exported function from C#, in another process?

本文关键字:c++ 调用 函数 另一个 进程      更新时间:2023-10-16

在谷歌上搜索了一番之后,我还没有找到任何与这个问题相关的有用的东西,所以我在这里问一下。

我有一个用c#编写的程序,它将DLL注入到另一个进程中,相当琐碎。它调用CreateRemoteThread和LoadLibrary从kernel32.dll与[DllImport].

我的DLL一旦加载,然后等待c#程序的认证,由于安全原因,我不能使用套接字传输此数据。所以我让我的DLL导出一个函数,该函数计划从c#程序中调用身份验证数据。

导出函数接受两个参数,如下所示:

extern "C" __declspec(dllexport) void DoStuff( const char* ccString1, const char* ccString2 ){
    // Do stuff
}

由于DLL与c#程序不在同一个地址空间中,所以我不能使用[DllImport]来获取和调用导出的函数。

我的第二个想法是使用CreateRemoteThread来调用函数,虽然只能传递1个参数,而我需要两个,这也很困难,因为我需要调用GetProcAddress的返回,我不能简单地通过导出函数直接调用。

那么,我该如何做到这一点呢?

谢谢

[DllImport]与GetProcAddress相同。c#在第一次调用之前不会加载DLL,因此。net可以在调用DLL之前进行安全检查。


如果你根本不信任DLL,那么最好将c#程序一分为二。一个程序通过Remoting/WCF/IPC连接到第二个程序,第二个程序通过DllImport连接到C DLL。当您不相信C DLL的稳定性或内存分配时,通常使用此解决方案,因为第二个程序(调用de C DLL的程序)可以重新启动,而无需重新启动主程序。这种模式的例子:一些windows驱动程序(除了它们此时不使用c#)。

您可以使用非持久化内存映射文件在应用程序和DLL之间交换数据。