2016-12-27 10 views
1

アセンブリをロードしませんが、私はC#スクリプトAPIは、私は、LINQステートメントを実行するC#のスクリプトAPIを使用するには、.NETのコアのコンソールプログラムを作成しようとした

「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

SystemのDLLの異なるバージョンをターゲットMicrosoft.CodeAnalysis.ScriptingMicrosoft.NETCore.App間の依存競合しているようで、それらまで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

うわー、うまくいく〜ありがとう、ありがとう。 p.s. InteractiveAssemblyLoaderは使い捨てですので、この答えをを使用して更新することができます。 –

関連する問題