gpt4 book ai didi

c# - 并非所有程序集都从 bin 文件夹加载到 AppDomain

转载 作者:IT王子 更新时间:2023-10-29 04:41:34 25 4
gpt4 key购买 nike

我有以下方法应该检索加载的本地(在 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 文件夹中。

为什么当应用程序启动时,bin 文件夹中的二进制文件没有被清扫到 AppDomain 中?

最佳答案

Adil 有,但更详细:

.NET CLR 使用即时编译。除其他事项外,这意味着它会在首次使用时加载程序集。因此,尽管程序集被正在使用的程序集引用,但如果 CLR 还不需要引用来执行程序,则它们不会被加载,因此不会出现在当前 AppDomain 的程序集列表中。

另一件可能适用也可能不适用的事情是,如果您在 GAC 中有相同版本的程序集,则 CLR 优先使用 GAC 而不是本地程序集,除非在 DEVPATH 环境变量中指定了这些程序集的路径.如果是这种情况,并且 CLR 正在使用任何“缺失”程序集的 GAC 副本,它们将具有不同的 CodeBase 值,并且不会显示在您的 Linq 查询结果中。

另一件事:您可能要考虑使用 Location 属性而不是 CodeBase 属性。 Location 属性包含运行时加载的程序集的绝对路径。 CodeBase 属性略有不同,并且对于项目的完整构建中的所有程序集可能不相同。

关于c# - 并非所有程序集都从 bin 文件夹加载到 AppDomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10284861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com