2016-12-27 85 views
1

我试着写一个.NET的核心控制台程序使用C#API脚本运行LINQ的声明,但我不断收到错误说C#脚本API不会加载组件

“System.Linq的,版本= 4.1 .1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'---> System.IO.FileLoadException:本机映像无法多次加载。

这里是我的程序:

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using Microsoft.CodeAnalysis.CSharp.Scripting; 
using Microsoft.CodeAnalysis.Scripting; 

namespace ConsoleApplication 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      try 
      { 
       var scriptOptions = ScriptOptions.Default; 

       //Add reference to mscorlib 
       var mscorlib = typeof(System.Object).GetTypeInfo().Assembly; 
       var systemCore = typeof(System.Linq.Enumerable).GetTypeInfo().Assembly; 
       scriptOptions = scriptOptions.AddReferences(mscorlib, systemCore); 

       //Add namespaces 
       scriptOptions = scriptOptions.AddImports("System"); 
       scriptOptions = scriptOptions.AddImports("System.Linq"); 
       scriptOptions = scriptOptions.AddImports("System.Collections.Generic"); 

       var state = CSharpScript.RunAsync(@"var x = new List<int>(){1,2,3,4,5};", scriptOptions).Result; 
       state = state.ContinueWithAsync("var y = x.Take(3).ToList();").Result; 

       var y = state.Variables[1]; 
       var yList = (List<int>)y.Value; 
       foreach(var val in yList) 
       { 
       Console.Write(val + " "); // Prints 1 2 3 
       } 
      } 
      catch (CompilationErrorException e) 
      { 
       Console.WriteLine(string.Join(Environment.NewLine, e.Diagnostics)); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(string.Join(Environment.NewLine, e)); 
      } 
     } 
    } 
} 

这里是我的project.json:

{ 
    "version": "1.0.0-*", 
    "buildOptions": { 
    "debugType": "portable", 
    "emitEntryPoint": true 
    }, 
    "dependencies": { 
    "Microsoft.CodeAnalysis.CSharp.Scripting": "2.0.0-rc2" 
    }, 
    "frameworks": { 
    "netcoreapp1.1": { 
     "dependencies": { 
     "Microsoft.NETCore.App": { 
      "type": "platform", 
      "version": "1.1.0" 
     } 
     }, 
     "imports": ["dnxcore50", "net452"] 
    } 
    } 
} 

回答

3

似乎是Microsoft.CodeAnalysis.ScriptingMicrosoft.NETCore.App针对不同版本的System的DLL之间的依赖关系冲突,直到那些是对齐的,它看起来像你可以使用InteractiveAssemblyLoader来告诉CSharpScript编译器加载应用程序实际提供的依赖关系的版本。

var scriptOptions = ScriptOptions.Default; 

    // Add reference to mscorlib 
    var mscorlib = typeof(object).GetTypeInfo().Assembly; 
    var systemCore = typeof(System.Linq.Enumerable).GetTypeInfo().Assembly; 

    var references = new[] { mscorlib, systemCore }; 
    scriptOptions = scriptOptions.AddReferences(references); 

    List<int> yList; 
    using (var interactiveLoader = new InteractiveAssemblyLoader()) 
    { 
     foreach (var reference in references) 
     { 
      interactiveLoader.RegisterDependency(reference); 
     } 

     // Add namespaces 
     scriptOptions = scriptOptions.AddImports("System"); 
     scriptOptions = scriptOptions.AddImports("System.Linq"); 
     scriptOptions = scriptOptions.AddImports("System.Collections.Generic"); 

     // Initialize script with custom interactive assembly loader 
     var script = CSharpScript.Create(@"", scriptOptions, null, interactiveLoader); 
     var state = script.RunAsync().Result; 

     state = state.ContinueWithAsync(@"var x = new List<int>(){1,2,3,4,5};").Result; 
     state = state.ContinueWithAsync("var y = x.Take(3).ToList();").Result; 

     var y = state.Variables[1]; 
     yList = (List<int>)y.Value; 
    } 

    foreach (var val in yList) 
    { 
     Console.Write(val + " "); // Prints 1 2 3 
    } 

    // ... 
+0

哇,它的作品〜非常感谢。附: InteractiveAssemblyLoader是一次性的,所以你可能想要使用更新这个答案。 –