是否有可能知道哪个 .dll 称为 C# 服务?即使调用首先通过 COM 层?

Posted

技术标签:

【中文标题】是否有可能知道哪个 .dll 称为 C# 服务?即使调用首先通过 COM 层?【英文标题】:Is it possible to know which .dll called a C# service? Even if the call passes through a COM layer first? 【发布时间】:2021-03-15 03:25:03 【问题描述】:

我们的分层架构具有原生 C++ 客户端和托管客户端 C++/C# 包装器。 (2个dll文件,1个本地1个托管)

这两个客户端通过 COM 层到达 C# 服务,这些客户端有许多不同的版本,并且服务被设计为向后兼容。

最近我们意识到我们可能需要知道调用服务的客户端的版本。 (dll 文件) 有没有办法通过调用堆栈并获取调用的 dll 及其版本?通过 COM 层是否会使这成为一项不可能完成的任务?

其他产品使用和交付这些客户端,因此 dll 的位置或路径并不总是已知的。通过调用堆栈获取位置可能是解决方案的替代途径,但我可能完全错误地考虑了这一点。

我们无法编辑现有发布的客户端 dll,因此我们必须能够在运行时从服务层确定 dll 的版本。

【问题讨论】:

所有的 dll 文件都将对服务进行相同的调用,我希望可以将编程方法添加到服务中的这些调用中,以更改某些版本的客户端的行为。跨度> 不,这不可能以自动/可配置的方式实现,您必须向您的通信接口/API 添加一些功能,它会告诉您这一点,至少对于新客户端/服务器而言。跨度> 你的客户告诉你的服务是谁在打电话不是更容易吗?它只是您界面中的一个附加功能,用于识别调用者(可能是可选的) @xMRi 是的,我们计划为未来的新客户这样做。 【参考方案1】:

可以捕获stacktrace,遍历各种堆栈帧,获取每个堆栈帧的方法信息,获取声明类型,并找到该类型的程序集。然而,这相当麻烦,并且会很慢,因为它会使用大量反射。我不确定 COM 是否会影响这一点,但我怀疑它不应该,只要调用不在线程之间跳转。

这也是相当糟糕的做法,因为方法调用依赖于调用者不明显的信息。因此,对于新开发人员来说,它可能会非常混乱,并且可能很脆弱。

也许检查加载了哪些 dll 而不是调用的版本就足够了?

我建议尽可能让您的服务正常工作,无论客户如何,如果需要,可能会在呼叫中添加信息。另一种方法是指定服务的多个版本,并让客户端调用它已开发的版本。第三种方法是明确告知服务有关客户端版本的信息,如果未这样做,则假定某些特定的客户端版本。

【讨论】:

以上是关于是否有可能知道哪个 .dll 称为 C# 服务?即使调用首先通过 COM 层?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到哪个未注册的 DLL 正在实现 COM 对象?

从另一个 C# DotNet DLL 动态加载和调用 C# DotNet DLL

将 C++ DLL 添加到 C# 项目

从 C# 调用 Powershell 函数

C#调用PCSC即(winscard.dll)中SCardGetStatusChange()怎么使用?

.dll文件是干啥的?