【问题标题】:How can I invoke different versions of the same assembly in a single .NET Core application?如何在单个 .NET Core 应用程序中调用同一程序集的不同版本?
【发布时间】:2019-06-06 21:24:08
【问题描述】:

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

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

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

问题

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

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

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

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

在类似的方法中,我可以编写一个主机进程,我的应用程序使用 IPC 与之通信,但这增加了难以置信的复杂性和潜在的故障点。

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

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

【问题讨论】:

  • 我认为使用 IPC 的方法在这里最好。这是 .net 核心中 appdomain 的唯一替代方案。它只是以简单的方式设计的。有进程,有另一个进程,他们可以交流。完毕。没有 appdomain 或任何多余的概念。您可以在一个简单的请求/响应界面中轻松地装饰它们。
  • 您可能想看看 AssemblyLoadContext。例如看这里github.com/dotnet/samples/blob/master/core/tutorials/Unloading/…

标签: c# .net-core


【解决方案1】:

我可以通过生成包含 正确组装,但这种操作发生了数万次 每秒并且调用有点时间敏感,所以这个 不可行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多