【发布时间】: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/…