如何在非托管 c++ dll 中查找调用方程序集名称

Posted

技术标签:

【中文标题】如何在非托管 c++ dll 中查找调用方程序集名称【英文标题】:How to find caller assembly name in unmanaged c++ dll 【发布时间】:2011-03-28 13:16:51 【问题描述】:

我有一个非托管 c++ dll。我正在从 c# (.net 3.5) 调用这个非托管 dll 的外部方法

我正在寻找一种方法来查找 witch c# 程序集正在调用我的非托管 c++ dll(到我的 c++ dll 中)(至少,程序集的名称)

当然,我不想将任何额外的参数传递给方法

提前致谢

【问题讨论】:

西方的邪恶女巫? 【参考方案1】:

这需要堆栈遍历。在托管代码中运行良好,这就是代码访问安全性的实现方式。 not 当有本地堆栈帧要走时,是否工作得很好。您可以在本机代码中尝试 StackWalk64()。昂贵且不太可能很好地工作,尤其是在 CLR 不再伪造模块的 .NET 4.0 中。 非常警惕帧指针省略优化选项。

我会说,不要这样做。只需让托管代码传递一个额外的参数即可轻松解决。

【讨论】:

【参考方案2】:

我终于找到了解决方案。

我正在寻找一种方法来限制不允许访问我的非托管 dll。所以我爬取了调用者程序集位置的堆栈跟踪。

最后我决定检查调用者程序集的公钥令牌(以这种方式找到)并验证它。

感谢您的时间和回答...

【讨论】:

您能提供更多信息吗?您如何在非托管 c++ 程序集中检查调用者 c# 程序集的公钥令牌?能给个代码例子吗? 以下代码获取dll文件的完整路径和dll文件的调用者:char ownPth[MAX_PATH];char callingPath[MAX_PATH];HMODULE hModule = globalHandle;HMODULE hModule = globalHandle;GetModuleFileName(hModule, ownPth, (sizeof(ownPth)));GetModuleFileName(NULL, callingPath, (sizeof(callingPath)));ownPathStr = std::string(ownPth);callingPathStr = std::string(callingPath);【参考方案3】:

你不知道。您的外部方法可以由任何与 C 兼容的语言调用,因此 Windows 和 CRT 不会存储任何关于 CLR 语言的额外内容。

【讨论】:

以上是关于如何在非托管 c++ dll 中查找调用方程序集名称的主要内容,如果未能解决你的问题,请参考以下文章

在非托管 C++ 程序中实现 C# DLL COM 文件

在非托管 C++ DLL 和托管 C# UI 之间发送信息

如何将数据从非托管应用程序传递到 C# COM DLL

如何在非托管 C++ 中捕获托管异常(来自委托)?

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?