将变量传递给在加载Roslyn的脚本中实现的类

时间:2017-05-14 08:17:19

标签: c# scripting roslyn

我正在尝试实现一个脚本评估程序,以评估我的用户将实现的一些类,这些类将有一个固定的入口点,接受将从主应用程序提供的变量。

为此,我已经声明了一个名称空间,其中包含将传递给入口点的对象的类型。这是声明自定义类型并执行脚本的整个代码:

namespace MyNamespace
{
    public class Vertex
    {
        public float X { get; } = 0.0f;
        public float Y { get; } = 0.0f;
        public float Z { get; } = 0.0f;

        public Vertex(float x, float y, float z)
        {
            X = x;
            Y = y;
            Z = z;
        }

        public override string ToString()
        {
            return string.Format("[{0}, {1}, {2}]", X, Y, Z);
        }
    }
}

public class Globals
{
    public Vertex testVertex = new Vertex(0, 0, 0);
    public int testValue = 100;
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ScriptOptions options = ScriptOptions.Default;

            // Add assemblies
            options = options.AddReferences(
                typeof(System.Object).GetTypeInfo().Assembly,
                typeof(System.Linq.Enumerable).GetTypeInfo().Assembly,
                typeof(MyNamespace.Vertex).GetTypeInfo().Assembly
            );

            // Add usings
            options = options.AddImports("System");
            options = options.AddImports("System.Linq");
            options = options.AddImports("System.Collections.Generic");
            options = options.AddImports("MyNamespace");

            var script = <added below>;

            Globals globals = new Globals();

            ScriptState<object> scriptState = CSharpScript.RunAsync(script, options: options, globals: globals).Result;
            scriptState = scriptState.ContinueWithAsync(@"Figure fig = new Figure();").Result;
            scriptState = scriptState.ContinueWithAsync(@"fig.Draw(testVertex);").Result;
        }
        catch (CompilationErrorException e)
        {
            Console.WriteLine(string.Join(Environment.NewLine, e.Diagnostics));
        }
    }
}

这是我正在尝试加载的脚本示例:

public class Figure
{
    public void Draw(Vertex v)
    {
        System.Console.WriteLine(v.ToString());
    }

    public void Draw(int i)
    {
        System.Console.WriteLine(i);
    }
}

现在,问题是当我在脚本中调用类Draw的方法Figure时,它会抛出一个异常说

error CS1503: Argument 1: cannot convert from 'MyNamespace.Vertex [~/Projects/ScriptTest/ScriptTest/bin/Debug/netcoreapp1.0/ScriptTest.dll]' to 'MyNamespace.Vertex [ScriptTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]'

当我这样做时

scriptState = scriptState.ContinueWithAsync(@"fig.Draw(testValue);").Result; // Using testValue instead of testVertex

一切正常。

它认为问题是该脚本指的是与MyNamespace不同的命名空间,但我不知道如何解决这个问题。

0 个答案:

没有答案