不是所有的组件都被加载到AppDomain中bin文件夹(Not all assemblies ar

2019-06-23 21:35发布

我有以下的方法应该获取的加载本地(在bin文件夹)组件列表:

static IEnumerable<Assembly> GetLocalAssemblies()
    {
        Assembly callingAssembly = Assembly.GetCallingAssembly();
        string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath;

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList();
    }  

但是,组件列表中缺少的是我需要它有几个组件。 我需要的是管理(C#.NET 4)的组件,在该项目中引用,并出现在bin文件夹中。

为什么二进制文件存在于应用程序启动时不扫到的AppDomain bin文件夹?

Answer 1:

阿迪尔有之,但更多的细节:

在.NET CLR使用即时编译。 别的不说,这意味着它加载在第一次使用组件。 所以,尽管组件正在使用中的组件引用,如果引用尚未执行程序需要由CLR,他们没有加载,所以不会出现在当前的AppDomain组件列表。

这可能会或可能不适用的另一件事是,如果你在GAC组件的相同版本的CLR使用GAC优先在地方议会,除非在DEVPATH环境变量指定的那些集路径。 如果是这种情况和CLR是使用任何的“失踪”组件的GAC复制,他们将有不同的基本代码值,并在您的LINQ查询结果将显示不出来。

还有一两件事:你可能要考虑使用位置属性,而不是将codebase属性。 Location属性包含对在运行时加载的程序集的绝对路径。 codebase属性略有不同,而且可能不是在项目的整体构建的所有组件相同。



Answer 2:

该CurrentDomain.GetAssemblies()只返回加载的程序集不是这是在执行文件夹中的所有组件。

这就是微软说些什么“GetAssemblies方法来获取已加载到应用程序域的所有组件的列表。” 点击这里



Answer 3:

尝试启动这些程序集缺失任何一类,然后再次运行代码..只在需要时与第一次调用与该组件的任何程序集加载。



文章来源: Not all assemblies are being loaded into AppDomain from the bin folder