小编eri*_*icc的帖子

用 AssemblyLoadContexts 替换 .NET AppDomains

我正在尝试将 .NET Framework 类库升级到 .NET 6,但遇到了有关 AppDomains 的一些问题。我最初没有编写该库,但我的理解是,它创建一个与 .NET 运行时为其创建的 AppDomain 分开的 AppDomain,通过调用使用这个新的应用程序域实例化一些自己的类型,然后AppDomain.CreateInstanceAndUnwrap这些实例加载其他第三个类型- 党代表大会接受检查。我认为它以这种方式实例化自己的类型的原因是为了将处理第三方程序集的代码以及这些程序集本身与库的执行上下文完全隔离。

通过阅读文档和 .NET 博客,我了解到 AppDomains 从 .NET Core 或更高版本开始已停用,以隔离方式加载程序集的正确方法是使用AssemblyLoadContexts。因此,我用自己的子类覆盖了 AssemblyLoadContext,并使用它来加载库的程序集,使用这些实例实例化其类型Assembly.CreateInstance并使用这些实例来加载第三方程序集,正如我在网上阅读的内容表明这是确保最干净的方法您正在将程序集加载到与您的代码本身不同的上下文中。

这种方法存在一些不确定性 - 我不确定是否仍然有必要在单独的上下文中实例化我们的库的类型。System.Object如果是的话,我在将实例从返回的类型转换Assembly.CreateInstance为正确的原始类型时遇到问题 。

这是我的 AssembyLoadContext 衍生物:

namespace MyNamespace
{
    class MyLoadContext : AssemblyLoadContext
    {
        private AssemblyDependencyResolver _resolver;
        public MyLoadContext(string basePath)
        {
            _resolver = new AssemblyDependencyResolver(basePath);

           
        }

        protected override Assembly Load(AssemblyName assemblyName)
        {
            string assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
            if(null != assemblyPath)
            {
                return LoadFromAssemblyPath(assemblyPath);
            }

            return null;

        } …
Run Code Online (Sandbox Code Playgroud)

.net c# .net-core .net-6.0

6
推荐指数
1
解决办法
1204
查看次数

标签 统计

.net ×1

.net-6.0 ×1

.net-core ×1

c# ×1