C# 找不到类型。它可能需要装配鉴定,例如;MyType,MyAssembly“;

C# 找不到类型。它可能需要装配鉴定,例如;MyType,MyAssembly“;,c#,.net,autofac,C#,.net,Autofac,我有一个.NET核心项目,我是通过dotnet构建的。然后我在构建之后进行dotnet存储和dotnet发布。“Test.dll”在运行时包存储中生成,之后在发布文件夹中生成。当我运行“dotnet MyProject.dll”时,我在builder.Build()期间遇到一个异常: System.InvalidOperationException:找不到类型“TestModule,Test”。它可能需要装配鉴定,例如“MyType,MyAssembly” MyJsonFile.json {

我有一个.NET核心项目,我是通过dotnet构建的。然后我在构建之后进行dotnet存储和dotnet发布。“Test.dll”在运行时包存储中生成,之后在发布文件夹中生成。当我运行“dotnet MyProject.dll”时,我在builder.Build()期间遇到一个异常:

System.InvalidOperationException:找不到类型“TestModule,Test”。它可能需要装配鉴定,例如“MyType,MyAssembly”

MyJsonFile.json

{
    "modules": [
     {
        "type": "TestModule, Test",
        "properties": {
            "PluginInstanceNames": [ "Test" ]
        }
      }
   ]
}
MyProject.cs

var configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("MyJsonFile.json");
var configModule = new ConfigurationModule(configBuilder.Build());

builder = new ContainerBuilder();
builder.RegisterModule(configModule);
builder.Build();
为什么它不从运行时包存储中的.json文件中搜索模块?它是如何工作的

只有当我添加了这个回调函数时,它才会工作,其中“path”是字符串数组,带有指向运行时存储文件夹和发布文件夹的路径

AssemblyLoadContext.Default.Resolving += (context, name) =>
{
     var dll = Array.Find(path, f => f.EndsWith(name.Name + ".dll"));
     if (dll == null)
     {               
         return null;
     }
     Assembly assembly = context.LoadFromAssemblyPath(dll);
     return assembly;
}

Autofac不负责程序集加载,.NET framework负责。在.NET Core中加载程序集与在桌面上加载经典的.NET framework不同,正如您所看到的,它确实需要额外的工作。解释,;我们有一个很好的解决方案,但它的长短是:您需要自己使用
AssemblyLoadContext
,就像加载插件一样