替换 Net Core 中的 AppDomain

Posted

技术标签:

【中文标题】替换 Net Core 中的 AppDomain【英文标题】:Replacing AppDomain in Net Core 【发布时间】:2017-03-04 12:40:26 【问题描述】:

所以,我是 C# 和 Net Core 的新手,有人将代码传递给了评估命令。 但是不是Net Core做的,所以Net Core中不存在AppDomain,怎么办?

ScriptOptions so = ScriptOptions.Default;

            so = so.WithImports(new string[]  "System.Math", "System.Diagnostics", "System.Runtime.InteropServices",
            "Discord.WebSocket", "Discord.Commands", "Discord", "System.Threading.Tasks", "System.Linq", "System", "System.Collections.Generic", "System.Convert", "System.Reflection");
            so = so.WithReferences(AppDomain.CurrentDomain.GetAssemblies().Where(xa => !xa.IsDynamic && !string.IsNullOrWhiteSpace(xa.Location)));

【问题讨论】:

【参考方案1】:

.net 核心中没有AppDoamain,您可以使用Microsoft.Extensions.DependencyModel 库来实现您所需要的。

下面是来自article 的代码。您可以在那里查看完整的详细信息。

return GetReferencingLibraries("Specify")
.SelectMany(assembly => assembly.ExportedTypes);

public static IEnumerable<Assembly> GetReferencingAssemblies(string assemblyName)

    var assemblies = new List<Assembly>();
    var dependencies = DependencyContext.Default.RuntimeLibraries;
    foreach (var library in dependencies)
    
        if (IsCandidateLibrary(library, assemblyName))
        
            var assembly = Assembly.Load(new AssemblyName(library.Name));
            assemblies.Add(assembly);
        
    
    return assemblies;


private static bool IsCandidateLibrary(RuntimeLibrary library, assemblyName)

    return library.Name == (assemblyName)
        || library.Dependencies.Any(d => d.Name.StartsWith(assemblyName));

您需要包含Microsoft.Extensions.DependencyModel 包才能使用上述代码。

【讨论】:

只是为了澄清 AppDomain 并没有像 it is part of .Net Standard 2.0 那样完全消失。

以上是关于替换 Net Core 中的 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 中的 WCF 替换

替换 ASP.NET Core 内置 DI 容器中的服务注册?

在不中断授权流程的情况下替换 OpenIdConnectOptions 配置中的发现文档端点 (OpenID Connect .Net Core 3.1)

如何在 .Net Core 中替换 System.Net.IPAddress.Any 并监听所有网络适配器

在 .NET Core 中替换 AssemblyBuilder.DefineDynamicAssembly

用Autofac替换.net core 内置容器