Der Globals
Typ sollte keine globalen Variablendeklarationen halten, wie es Eigenschaften ist.
Angenommen, Sie die richtigen Referenzen für Ihr Skript bekam:
var metadata = MetadataReference.CreateFromFile(typeof(MyClass).Assembly.Location);
Option 1
Sie benötigen einen globalen var vom Typ MyClass zu definieren:
public class Globals
{
public MyClass C { get; set; }
}
Und verwenden Sie das als Globals
Typ:
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;
Beachten Sie, dass in dem ContinueWith
Ausdruck der eine C
Variable sowie eine C
Eigenschaft in Globals
. Das sollte den Trick machen.
Option 2
In Ihrem Fall ist es sinnvoll, einen Delegierten zu erstellen, wenn Sie das Skript mehrmals aufrufen beabsichtigen:
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 });
Option 3
In Ihrem Fall brauchen Sie nicht einmal 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);
Lesen Sie das Dokument zu übergeben: https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples – Tommy
Aber Sie scheint zu müssen Compiler, um Ihre Klasse zu kompilieren, anstatt eine Skript-Engine, um Code auszuführen. Verwenden Sie 'CSharpSyntaxTree.ParseText': http://www.tugberkugurlu.com/archive/compiling-c-sharp-code-into-memory-and-executing-it-with-roslyn – Tommy
@Tommy Die Beispiele sollten wie das zu parametrisieren Skript, aber in meinem Fall möchte ich einen Parameter an die Methode übergeben, die die Beispiele nicht zeigen. ParseText scheint interessant, aber ich möchte nicht temporäre Assemblies erstellen, bevor Sie den Code ausführen. –