2016-07-09 6 views
3

次のスニペットでは、オブジェクトのパラメータをスクリプトのメソッドに渡す方法を教えてください。オブジェクトをスクリプトに渡すには?

+0

は、文書読み取り渡す必要はありません。https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples – Tommy

+0

をしかし、あなたが必要とするようですコンパイラは、スクリプトエンジンではなくクラスをコンパイルして、いくつかのコードを実行します。 'CSharpSyntaxTree.ParseText'を使用してください:http://www.tugberkugurlu.com/archive/compiling-c-sharp-code-into-memory-and-executing-it-with-roslyn – Tommy

+0

@Tommyサンプルは、私の場合、サンプルには表示されないメソッドにパラメータを渡したいと考えています。 ParseTextは興味深いようですが、コードを実行する前に一時的なアセンブリを作成したくありません。 –

答えて

2

Globalsタイプは、グローバル変数宣言をそのプロパティとして保持する必要があります。あなたはMyClass型のグローバルなVARを定義する必要が

var metadata = MetadataReference.CreateFromFile(typeof(MyClass).Assembly.Location); 

オプション1

public class Globals 
{ 
    public MyClass C { get; set; } 
} 

あなたのスクリプトの正しい参照を得たと仮定すると、

それをGlobalsタイプとして使用してください:

var script = 
    await CSharpScript.Create(
     code: code, 
     options: ScriptOptions.Default.WithReferences(metadata), 
     globalsType: typeof(Globals)) 
    .ContinueWith("new TestClass().HelloWorld(C)") 
    .RunAsync(new Globals { C = c }); 

var output = script.ReturnValue; 

ContinueWith式でC変数ならびにGlobalsC性であること。それはトリックを行う必要があります。

var f = 
    CSharpScript.Create(
     code: code, 
     options: ScriptOptions.Default.WithReferences(metadata), 
     globalsType: typeof(Globals)) 
    .ContinueWith("new TestClass().HelloWorld(C)") 
    .CreateDelegate(); 

var output = await f(new Globals { C = c }); 

オプション3:あなたはスクリプトを複数回コールするつもりなら、それはデリゲートを作成する意味がありますあなたの場合は


オプション2

あなたのケースではあなたも、任意のGlobals

var f = 
    await CSharpScript.Create(
     code: code, 
     options: ScriptOptions.Default.WithReferences(metadata)) 
    .ContinueWith<Func<MyClass, bool>>("new TestClass().HelloWorld") 
    .CreateDelegate() 
    .Invoke(); 

var output = f(c); 
+0

すべてのオプションが期待通りに機能する素晴らしい答えです。これらの例は、Roslynで可能なことを示し、サンプルに含める必要があります。 –

関連する問題