1

脚本评估代码片段:

        using (var loader = new InteractiveAssemblyLoader())
        {
            var script = CSharpScript.Create<TDataType>(
           code: expr,
           options: ScriptOptions.Default.AddImports(globals.GetType().Namespace)
                                         .AddReferences(refAssemblies),
           globalsType: globals.GetType(),
           assemblyLoader: loader);

            return script.RunAsync(globals).Result.ReturnValue;
        }

代码分析程序集和全局类型程序集被加载到同一个 Collectible AssemblyLoadContext... 还尝试通过 ScriptOptions 显式添加引用/导入,但得到相同的以下错误:

内部异常 1:InvalidCastException:[A]TestLibrary.TestClass 不能转换为 [B]TestLibrary.TestClass。类型 A 源自 'TestLibrary,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null',位于位置 '...\TestLibrary.dll' 的上下文 'Default' 中。类型 B 源自 'TestLibrary,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null',位于位置 '...\TestLibrary.dll' 的上下文 'Default' 中。

4

1 回答 1

0

似乎程序集加载器TestLibrary在您的动态代码中加载了两次,您可以避免手动解析程序集(注意 TestLibrary 在两个项目中必须是相同的版本)

//Somewhere in your startup code:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

static Assembly MyResolveEventHandler(object sender, AssemblyLoadEventArgs args)         
{
    //First time it will be null and the resolver will load it from the default path, the succesive requests to load the library will return the already loaded assembly.
    if(args.Name == "TestLibrary")
        return AppDomain.CurrentDomain.GetAssemblies().Where(a => a.Name == args.Name).FirstOrDefault(); 

    return null;
}
于 2020-06-13T02:21:20.673 回答