gpt4 book ai didi

c# - "Could not load file or assembly ' System.Core, Version=2.0.5.0,...”动态加载可移植类库时出现异常

转载 作者:可可西里 更新时间:2023-11-01 08:25:58 24 4
gpt4 key购买 nike

首先,我需要强调的是,这个问题与 this thread 中的问题略有不同。 .此外,安装 KB2468871没有帮助。

我尽量简化了这个问题。一般来说,它是关于使用 Assembly.LoadFile(...) 在桌面应用程序中加载 PCL 程序集。

假设有一个 .NET 4.0 控制台应用程序(称为“C”)。它引用 .NET 4.0 程序集(称为“N4”)和 PCL 程序集(称为“PCL”)。

N4 看起来像这样:

using System.Linq;

namespace N4
{
public class ClassInN4
{
public static string Greet()
{
return new string(
"hello from N4"
.ToCharArray()
.Select(char.ToUpper)
.ToArray()
);
}
}
}

PCL 看起来像这样:

using System.Linq;

namespace PCL
{
public class ClassInPCL
{
public static string Greet()
{
return new string(
"hello from pcl"
.ToCharArray()
.Select(char.ToUpper)
.ToArray()
);
}
}
}

C 看起来像这样:

using System;
using System.IO;
using System.Reflection;
using N4;
using PCL;

namespace C
{
internal class Program
{
private static void Main(string[] args)
{
Test();
Console.ReadLine();
}

private static void Test()
{
Test("N4", ClassInN4.Greet);
Test("PCL", ClassInPCL.Greet);
}

private static void Test(
string title,
Func<string> generator)
{
try
{
Console.WriteLine(
"{0}: {1}", title, generator());
}
catch (Exception e)
{
Console.WriteLine(
"{0}: {1} -> {2}", title, e.GetType(), e.Message);
}
}
}
}

当您运行这个应用程序时,您会得到绝对正确的结果:

N4: HELLO FROM N4
PCL: HELLO FROM PCL

让我们将 AssemblyResolve 事件添加到 Program.Main 中的 CurrentDomain:

AppDomain.CurrentDomain.AssemblyResolve += (_, a) => {
var fileName = Path.GetFullPath(
new AssemblyName(a.Name).Name + ".data");
Console.WriteLine("Probing '{0}'", fileName);
return
File.Exists(fileName)
? Assembly.LoadFile(fileName)
: null;
};

那么,如果找不到程序集,它会尝试从“.data”文件加载它。

让我们转到应用程序文件夹并将“N4.dll”重命名为“N4.data”并运行“C.exe”。

Probing 'C:\xxx\C\bin\Debug\N4.data'
N4: HELLO FROM N4
PCL: HELLO FROM PCL

因此它通过 AssemblyResolve 并最终加载“N4.data”并像原来一样工作。

让我们将“N4.data”还原为“N4.dll”,并将“PCL.dll”重命名为“PCL.data”,然后...

Probing 'C:\xxx\C\bin\Debug\PCL.data'
N4: HELLO FROM N4
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
PCL: System.IO.FileNotFoundException -> Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The system cannot find the file specified.

请注意,PCL 程序集加载得很好,问题是,它再也找不到它的依赖项 (System.Core)。

这就像 Assembly.LoadFile(fileName) 是一个禁忌,如果加载的程序集是可移植的。

有人遇到过这个问题吗?有人解决过这个问题吗?

您可以找到所有文件 here .

编辑:感谢 leppie 强制我检查其他选项。我实际上想确定我在回答“是的,是的,我试过”时没有撒谎。显然值得一试。

来自 Suzanne Cook's .NET CLR Notes :

Be careful - these aren't the same thing.

LoadFrom() goes through Fusion and can be redirected to another assembly at a different path but with that same identity if one is already loaded in the LoadFrom context. LoadFile() doesn't bind through Fusion at all - the loader just goes ahead and loads exactly* what the caller requested. It doesn't use either the Load or the LoadFrom context.

最佳答案

您可以返回 System.Coreversion 4.0.0.0 for .NET Framework 4.0 组装您的平台(例如 AssemblyResolve)事件,当被要求提供 2.0.5.0 时版本。

我正在通过 Load(byte[]) 加载所有作为资源存储的引用程序集| ,这也无法解决 2.0.5.0组装,我检索了两个 SystemSystem.Core来自 AppDomain.CurrentDomain.GetAssemblies() .

关于c# - "Could not load file or assembly ' System.Core, Version=2.0.5.0,...”动态加载可移植类库时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277499/

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