正在从DLLMain调用托管代码
Calling managed code from DLLMain
我正在编写一个非托管dll(使用c++和WinAPI),但我想使用一些c#方法,所以我使用c++/CLI创建了一个包装器。
但问题是:非托管dll将被"注入"(LoadLibrary),我被困在这里,不知道如何调用Wrapper函数。
非托管代码:
#include <Windows.h>
//the function I want to call
__declspec(dllexport) void SimpleTest(int *p);
extern "C" __declspec(dllexport) void MyEntryPoint()
{
int* test;
SimpleTest(test);
}
BOOL WINAPI DllMain(/*DllMain parameters*/)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
MyEntryPoint();
break;
}
return TRUE;
}
包装器(C++/CLI):
__declspec(dllexport) void SimpleTest(int* p)
{
*p = 1;
}
我不知道这里发生了什么。没有加载.NET环境?包装器DLL没有加载?(我循环浏览了模块,但包装器不在那里)。
我必须手动初始化CLR吗?
我读过关于装载机锁定的文章,但我不确定这是否是这里的问题。
从文档到DllMain
:
在DLL入口点中可以安全地执行的操作有很大的限制。有关在DllMain中调用不安全的特定Windows API,请参阅常规最佳实践。如果您需要除最简单的初始化之外的任何东西,请在DLL的初始化函数中执行。您可以要求应用程序在运行DllMain之后以及调用DLL中的任何其他函数之前调用初始化函数。
调用托管代码是不能做的事情之一!
处理此问题的标准方法是在DllMain
中创建一个线程,这是一个允许的操作,并从该线程调用托管代码。
Dlls和共享对象在C/C++标准中存在问题。
操作系统加载DLL,调用DllMain初始化全局变量,然后加载相关DLL。
这意味着a) 在DllMain/global构造过程中,加载程序被锁定b) 可能无法加载依赖DLL。
这意味着CLR可能不是活动的(未初始化),如果需要加载程序锁定,则可能挂起。
推迟到以后才是最好的解决办法。
class ImportantOnceWork{
ImportantOnceWork()
{
MyEntryPoint();
}
};
int DoOnce()
{
static ImportantOnceWork val;
}
然后调用DoOnce();在每个钩点。
相关文章:
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- P/从获取"tried to access protected memory error"调用非托管C++代码
- 从无操纵项目(C/C VS2005)调用托管代码(C#/Visual Basic VS2010)
- 从 VB.NET 调用非托管代码C++ dll
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 需要从非托管c++代码中调用托管代码
- C# P/调用:本机输出参数值不会到达托管代码
- 从托管代码调用本机函数
- 正在从DLLMain调用托管代码
- 从托管代码调用非托管方法
- 将非托管c++代码转换为托管c++,以便从c#调用
- 从非托管代码调用托管.NET代码的最佳方式
- 从非托管调用托管代码时发生StackoverflowException
- 在托管代码中调用SSE代码(对齐)
- 当64位非托管代码通过COM调用托管代码时会发生什么
- 调用托管代码的非托管代码在开发机器上工作,而不是在部署机器上工作
- 托管代码和非托管代码之间的调用
- Marsshall char** 用于从托管代码调用非托管代码时串起问题