如何在单个.NET Core应用程序中调用同一程序集的不同版本?

时间:2019-06-06 21:24:08

标签: c# .net-core

我有一个非常简单的程序集,用于获取一条数据并计算一个值。该程序集没有对其他程序集的引用,仅导出单个类:

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

此程序集在客户端和服务器之间共享。客户端将其数据及其获得的结果发送到服务器,服务器需要验证结果是否正确。

问题

有20个不同版本的客户端,每个版本都有不同的程序集版本,这些版本执行略有不同的计算。

我的服务器具有所有可用的程序集,需要调用与客户端匹配的正确版本。我可以保证任何程序集都没有目标框架或运行时兼容性问题。

备用解决方案(我不想要)

我可以通过生成包含正确程序集的子进程来实现此目的,但是此操作每秒发生数万次,并且调用在某种程度上对时间敏感,因此不可行。

以类似的方式,我可以编写一个主机进程,该进程与我的应用程序使用IPC进行通信,但这会增加大量的复杂性和潜在的故障点。

为每个程序集创建一个新的AppDomain似乎是理想的解决方案,但是.NET Core对此不提供支持。

还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:0)

  

我可以通过产生包括   正确的组装,但是此操作发生了数万次   每秒,并且调用有些时间敏感,所以这   不可行。

这可能是最好的方法。但是,不要每次都使 new 子进程保持运行,并通过IPC请求响应父进程。子进程将成为针对特定装配版本进行查询以进行计算的服务器。在父进程中,您将跟踪特定程序集版本的各种子进程的句柄,并调用适当的子进程。如果所需的程序集不存在,请创建一个,使其保持打开状态,然后保存以备后用。每个程序集的第一次调用只会很慢(如果这是一个问题,那么此解决方案将不可行);但之后很快。如果资源限制需要它,则可能需要在子进程的缓存上实现TTL,以便如果长时间不需要程序集版本,可以将其卸载以为新的子进程腾出空间。