无法加载文件或asssembly

时间:2017-06-10 19:01:49

标签: c# .net-core .net-assembly

我正在将vs2008中的.Net 3.5控制台应用程序移植到vs2017中的.Net Core控制台应用程序(目标框架netcoreapp1.1)。

程序通过在给定目录中查找.dll并将它们作为程序集加载来执行一些插件加载。

我已经将插件重建为netstandard1.6库。不可否认,我对Core,Framework和Standard之间的差异感到有些困惑。

我使用System.Runtime.Loader(v4.3.0)NuGet包和以下代码尝试从给定路径加载程序集:

public static Assembly LoadAssemblyFromPath(string path)
{
    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;

        string[] foundDlls =
            Directory.GetFileSystemEntries(new FileInfo(path).FullName, name.Name + ".dll", SearchOption.AllDirectories);

        return foundDlls.Any() ? context.LoadFromAssemblyPath(foundDlls[0]) : context.LoadFromAssemblyName(name);
    };

    return AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
}

我已验证路径参数是否正确,文件是否存在,但我仍然收到“无法加载文件或程序集”异常。永远不会提出解决事件。

任何人都可以提供任何有关我做错的见解吗?

1 个答案:

答案 0 :(得分:0)

我最终使用了以下内容:

    public static Assembly LoadAssemblyFromPath(string path)
    {
        string fileNameWithOutExtension = Path.GetFileNameWithoutExtension(path);

        bool inCompileLibraries = DependencyContext.Default.CompileLibraries.Any(l => l.Name.Equals(fileNameWithOutExtension, StringComparison.OrdinalIgnoreCase));
        bool inRuntimeLibraries = DependencyContext.Default.RuntimeLibraries.Any(l => l.Name.Equals(fileNameWithOutExtension, StringComparison.OrdinalIgnoreCase));

        return inCompileLibraries || inRuntimeLibraries
            ? Assembly.Load(new AssemblyName(fileNameWithOutExtension))
            : AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
    }