gpt4 book ai didi

c++ - 从 DLLMain 调用托管代码

转载 作者:行者123 更新时间:2023-11-30 02:34:37 25 4
gpt4 key购买 nike

我正在编写一个非托管 dll(使用 C++ 和 WinAPI),但我想使用一些 C# 方法,因此,我使用 C++/CLI 创建了一个包装器。

但问题是:非托管 dll 将被“注入(inject)”(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 环境没有加载? Wrapper DLL 没有加载? (我遍历了模块,但包装器不在那里)。

我必须手动初始化 CLR 吗?

我读到有关加载器锁的信息,但我不确定这是否是这里的问题。

最佳答案

从文档到DllMain :

There are significant limits on what you can safely do in a DLL entry point. See General Best Practices for specific Windows APIs that are unsafe to call in DllMain. If you need anything but the simplest initialization then do that in an initialization function for the DLL. You can require applications to call the initialization function after DllMain has run and before they call any other functions in the DLL.

调用托管代码是您不能做的事情之一!

处理此问题的标准方法是在 DllMain 中创建一个线程,一个允许的操作,并从该线程调用托管代码。

关于c++ - 从 DLLMain 调用托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com