簡體   English   中英

如何在單個.NET Core應用程序中調用同一程序集的不同版本?

[英]How can I invoke different versions of the same assembly in a single .NET Core application?

我有一個非常簡單的程序集,用於獲取一段數據並計算一個值。 此程序集沒有對其他程序集的引用,只導出單個類:

namespace MyAssembly
{
    public static class MyClass 
    {
        public int GetValue(byte[] input) 
        { 
            ... 
        }
    }
}

此程序集在客戶端和服務器之間共享。 客戶端將其數據及其獲得的結果發送到服務器,服務器需要驗證結果是否正確。

問題

有20個不同版本的客戶端,每個版本都有不同版本的程序集,執行略有不同的計算。

我的服務器具有所有可用的程序集,需要調用與客戶端匹配的正確版本。 我可以保證任何程序集都沒有目標框架或運行時兼容性問題。

替代解決方案(我不想要)

我可以通過生成包含正確程序集的子進程來實現這一點,但是這個操作每秒發生數萬次,並且調用有點時間敏感,因此這是不可行的。

在類似的方法中,我可以編寫一個我的應用程序使用IPC進行通信的主機進程,但這會增加大量的復雜性和潛在的失敗點。

似乎為每個程序集創建一個新的AppDomain是理想的解決方案,但.NET Core不支持這一點。

有沒有其他方法來實現這一目標?

我可以通過生成包含正確程序集的子進程來實現這一點,但是這個操作每秒發生數萬次,並且調用有點時間敏感,因此這是不可行的。

這可能是最好的方法。 但是,不是每次都使用新的子進程,而是讓子進程保持運行並通過IPC請求響應您的父進程。 子進程將成為查詢計算的特定程序集版本的服務器。 在父進程中,您可以跟蹤特定程序集版本的各種子進程的句柄,並調用相應的句柄。 如果所需的組件不存在,請創建一個,保持打開狀態,並保存以供日后使用。 每個組件的第一次調用只會很慢(如果這是一個問題,那么這個解決方案是不可行的); 但之后很快。 如果資源限制需要它,您可能需要在子進程的緩存上實現TTL,這樣如果在很長一段時間內不需要程序集版本,它可以被卸載以為更新的子進程騰出空間。

暫無
暫無

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

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