【问题标题】:Assembly.Load .NET CoreAssembly.Load .NET Core
【发布时间】:2019-04-18 13:45:07
【问题描述】:

我有一个使用AssemblyBuilder.DefineDynamicAssembly 动态生成的程序集,但是当我尝试加载它时,我收到以下错误:

System.IO.FileNotFoundException:'无法加载文件或程序集'test,Culture=neutral,PublicKeyToken=null'。系统找不到指定的文件。'

这是要重现的完整代码:

var name = new AssemblyName("test");
var assembly = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);
var assembly2 = Assembly.Load(name);

我正在使用 .NET Core 2.0、2.1 和 2.2。

有人能解释一下为什么会发生这种情况以及任何可能的解决方案吗?

【问题讨论】:

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


【解决方案1】:

Сause of error

您使用访问模式 AssemblyBuilderAccess.Run 定义了一个动态程序集,它不允许保存程序集。然后,您尝试使用 Assembly 类的 Load 方法加载程序集,该方法会搜索文件。

解决方案

如果您想在内存中使用动态程序集,那么您已经掌握了。下一步是在其他构建器的帮助下定义模块、类型等。

var moduleBuilder = assembly.DefineDynamicModule("test");
var typeBuilder = moduleBuilder.DefineType("someTypeName");
var type = typeBuilder.CreateType();
var instance = Activator.CreateInstance(type);

您可以在.NET API Docs 中找到更多信息。

【讨论】:

  • 我不想将程序集保存到磁盘上,使用它来创建和使用类型也没有问题。问题是我希望能够像 Assembly.Load 一样通过名称获取对程序集的引用。
  • AssemblyBuilder 类继承自 Assembly。如果您需要一个干净的 Assembly 类,请键入 cast:Assembly(assemblyBuilder)。
  • 我认为不可能简单地通过名称获取到程序集的链接。程序集应该在某种全局容器中(如文件系统或内存中的自定义容器)。而现在它只是 Assembly 类的一个对象。
  • MSDN 中有没有提到这个?
  • 这取决于我们在谈论什么。这是指向AssemblyBuilder class 的链接,其中指定了继承顺序:Object -> Assembly -> AssemblyBuilder。关于容器,这些是我的想法。我们在内存中有一个普通的对象。默认情况下,它只绑定到一个变量。接下来,我们自己需要考虑将其放置在何处以便按名称获取程序集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多