gpt4 book ai didi

c# - .NET Core 中的程序集加载

转载 作者:太空狗 更新时间:2023-10-29 22:36:10 25 4
gpt4 key购买 nike

使用 VS2017 RC,.NET 核心

我正在尝试从文件加载程序集。此程序集的依赖项位于同一文件夹中。

我正在使用 AssemblyLoadContext.Default.LoadFromAssemblyPath

我意识到 LoadFromAssemblyPath 专门加载请求的程序集,忽略它的依赖关系;任何迭代程序集类型的尝试都会失败,并出现 System.Reflection.ReflectionTypeLoadException

LoaderExceptions 包含 System.IO.FileNotFoundException 的列表。

我很好奇为什么会这样,因为所有必需的文件都在同一个文件夹中。

我还尝试加载一个文件夹中的所有 *.dll 文件,但有些失败并出现 System.IO.FileLoadException

我做错了什么?

编辑:我不想依赖 .deps 文件(因此排除了 DependencyContext)。可能吗?

最佳答案

嗯,对我有用的是在 LoadFromAssemblyPath 需要依赖项时,使用 Resolving 事件注册一个句柄并按需加载所需的程序集。请注意,这是我经过数小时的反复试验得出的解决方案,因此它可能不是最理想的方法。它现在对我有用。这是我的代码:

    AssemblyLoadContext.Default.Resolving += (context, name) =>
{
// avoid loading *.resources dlls, because of: https://github.com/dotnet/coreclr/issues/8416
if (name.Name.EndsWith("resources"))
{
return null;
}

var dependencies = DependencyContext.Default.RuntimeLibraries;
foreach (var library in dependencies)
{
if (IsCandidateLibrary(library, name))
{
return context.LoadFromAssemblyName(new AssemblyName(library.Name));
}
}

var foundDlls = Directory.GetFileSystemEntries(new FileInfo(<YOUR_PATH_HERE>).FullName, name.Name + ".dll", SearchOption.AllDirectories);
if (foundDlls.Any())
{
return context.LoadFromAssemblyPath(foundDlls[0]);
}

return context.LoadFromAssemblyName(name);
};
}
private static bool IsCandidateLibrary(RuntimeLibrary library, AssemblyName assemblyName)
{
return (library.Name == (assemblyName.Name))
|| (library.Dependencies.Any(d => d.Name.StartsWith(assemblyName.Name)));
}

IsCandidateLibrary() 位源自那里: http://www.michael-whelan.net/replacing-appdomain-in-dotnet-core/

我认为您可以省略此部分和整个 DependencyContext 部分,但它充当缓存并避免一遍又一遍地重新加载相同的程序集。所以我保留了它。

关于c# - .NET Core 中的程序集加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40908568/

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