如何在非托管 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 中查找调用方程序集名称的主要内容,如果未能解决你的问题,请参考以下文章