Assembly.Load .NET Core

时间:2019-04-18 13:45:08

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

我有一个使用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。

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

2 个答案:

答案 0 :(得分:1)

С错误原因

您使用访问模式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中找到更多信息。

答案 1 :(得分:0)

您可以使用此代码在.Net Core中动态地动态创建加载程序集

var fileName = "Test";
var compilation = CSharpCompilation.Create(fileName)
                                    .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

compilation.Emit($"{fileName}.dll");

var assemblyLoaded = AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.GetFullPath($"{fileName}.dll"));