如何在非托管代码中发现它是否在托管上下文中运行



我正在编写一个Excel VSTO加载项。此加载项加载并运行非托管代码。

在非托管dll的启动代码中,创建了一个用于处理请求的不可见窗口。这个函数调用会导致一个托管异常(LoaderLock(,如果我删除它,一切都正常。我想避免仅仅因为这个而创建一个额外的版本有没有一种方法可以让非托管代码在运行时发现它是否在托管线程中运行在这种情况下,我可以添加一个运行时检查。只有在完全非托管的环境中才需要该窗口。

注1:此问题仅发生在此Excel加载项中;使用非托管dll的独立托管控制台应用程序不会显示此问题。

注2:我知道有很多事情不应该在DllMain中完成。十多年来,我一直在托管和非托管环境中工作,我希望尽可能减少代码更改。

检查mscoree.dll是否已加载对我来说已经完成了任务:

if (::GetModuleHandleW(L"mscoree.dll") == nullptr)

这个:检查是否在运行时从COM模块加载了WIN32/Unmanaged DLL,这个:当代码";在";.NET CLR?帮助。正如下面的评论中所揭示的,这并不能说明哪个类型的线程加载了dll,而只能说明进程中是否有任何托管组件。更精确的检查仍然是首选。目前,我可以接受这个解决方案。

最新更新