簡體   English   中英

有沒有可能知道which.dll調用了C#服務? 即使調用先經過一個COM層?

[英]Is it possible to know which .dll called a C# service? Even if the call passes through a COM layer first?

我們有一個分層架構,它有一個本地 C++ 客戶端,以及一個圍繞它的托管客戶端 C++/C# 包裝器。 (2 個 dll 個文件,一個本地一個管理)

這兩個客戶端 go 通過一個 COM 層到一個 C# 服務,這些客戶端有很多不同的版本並且服務被設計成向后兼容。

最近我們意識到我們可能需要知道調用服務的客戶端的版本。 (dll 個文件)
有沒有辦法通過調用堆棧到 go 並獲取調用的 dll 及其版本? 遍歷 COM 層會使這成為一項不可能完成的任務嗎?

其他產品使用並交付這些客戶端,因此並不總是知道 dll 的位置或路徑。 通過調用堆棧獲取位置可能是解決方案的替代途徑,但我可能完全錯誤地考慮了這一點。

我們無法編輯現有已發布的客戶端 dll,因此我們必須能夠在運行時從服務層確定 dll 的版本。

可以捕獲堆棧跟蹤,遍歷各種堆棧幀,獲取每個堆棧幀的方法信息,獲取聲明類型,並找到該類型的程序集。 然而,這相當麻煩,而且會很慢,因為它會使用大量反射。 我不確定 COM 是否會影響這個,但我懷疑它不應該,只要調用不在線程之間跳轉。

這也是一種相當糟糕的做法,因為方法調用依賴於對調用者來說並不明顯的信息。 因此,對於新開發人員來說,它可能會非常混亂,並且可能很脆弱。

也許檢查加載了哪些 dll 就足夠了,而不是調用哪個版本?

我建議盡可能讓您的服務正常工作,而不管客戶端如何,如果需要,可能會向呼叫添加信息。 另一種方法是指定服務的多個版本,讓客戶端調用它開發時使用的版本。 第三種方法是明確通知服務有關客戶端版本的信息,如果未這樣做,則假定某個特定的客戶端版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM