有可能知道哪个.dll称为C#服务吗?即使调用首先通过COM层? 我们有一个分层架构,它有一个本地C++客户端,以及一个托管客户端C++/C++包装器。(2个dll文件,一个本机文件和一个托管文件)

有可能知道哪个.dll称为C#服务吗?即使调用首先通过COM层? 我们有一个分层架构,它有一个本地C++客户端,以及一个托管客户端C++/C++包装器。(2个dll文件,一个本机文件和一个托管文件),c#,c++,.net,com,.net-4.6.2,C#,C++,.net,Com,.net 4.6.2,这两个客户机通过COM层连接到C#服务,这些客户机有许多不同的版本,服务设计为向后兼容 最近我们意识到我们可能需要知道调用服务的客户端的版本。(dll文件) 有没有办法遍历调用堆栈并获取调用的dll及其版本?通过COM层是否使这成为一项不可能的任务 其他产品使用并交付这些客户机,因此DLL的位置或路径并不总是已知的。通过调用堆栈获取位置可能是解决方案的另一种途径,但我可能对此的想法完全错误 我们无法编辑现有已发布的客户端DLL,因此我们必须能够在运行时从服务层确定DLL的版本。可以捕获一个步骤,

这两个客户机通过COM层连接到C#服务,这些客户机有许多不同的版本,服务设计为向后兼容

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

其他产品使用并交付这些客户机,因此DLL的位置或路径并不总是已知的。通过调用堆栈获取位置可能是解决方案的另一种途径,但我可能对此的想法完全错误


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

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

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

也许检查加载了哪些DLL就足够了,而不是检查调用了哪个版本


如果可能的话,我建议您让您的服务正常工作,而不管客户是谁,如果需要,可能会在通话中添加信息。另一种方法是指定服务的多个版本,并让客户机调用它开发时使用的版本。第三种方法是显式地将客户端版本通知服务,如果不这样做,则假定某个特定的客户端版本。

所有dll文件都将对服务进行相同的调用,我的希望是,可以在服务中的这些调用中添加一个编程方法,以更改某些版本的客户端的行为。不,这不可能以自动/可配置的方式实现,您必须在通信接口/API中添加一些功能,至少对于新的客户端/服务器来说,这些功能会告诉您这一点。这不是更容易吗,你的客户告诉你的服务人员是谁?这只是界面中的一个附加函数,用于标识调用方(可能是可选的)@xMRi是的,我们计划为未来的新客户机这样做。