如何在另一个进程中从c#调用c++导出函数
How to call a C++ exported function from C#, in another process?
在谷歌上搜索了一番之后,我还没有找到任何与这个问题相关的有用的东西,所以我在这里问一下。
我有一个用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之间交换数据。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用