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

时间:2013-06-01 17:42:17

标签: c# c++ function process call

在一些严重的谷歌潜伏之后,我没有发现任何有用的问题,所以我会在这里问。

我有一个用C#编写的程序,它将DLL注入另一个进程,相当简单。它使用[DllImport]从kernel32.dll调用CreateRemoteThread和LoadLibrary。

我的DLL一旦加载然后等待来自C#程序的身份验证,由于安全原因,我无法使用套接字传输此数据。所以我让我的DLL导出了一个计划从C#程序调用带有认证数据的函数。

导出的函数有两个参数,如下所示:

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

    // Do stuff

}

由于DLL与C#程序不在同一个地址空间,因此我无法使用[DllImport]获取并调用导出的函数。

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

那么,我将如何实现这一目标呢?

由于

2 个答案:

答案 0 :(得分:0)

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


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

答案 1 :(得分:0)

您可以使用Non-persisted memory-mapped files在应用程序和DLL之间交换数据。