0

現在持っているスクリプト ソリューションを C# に移行しようと考えています。これにより、さまざまなプラットフォームでの実行に関して現在直面している問題のいくつかが解決されると信じています。スクリプト内にある関数を呼び出してその変数にアクセスすることはできますが、スクリプトが存在するクラスから関数を呼び出すことができるようにしたいと考えています。これ?

これは、スクリプト内のオブジェクトを呼び出してアクセスするために機能している現時点での私のコードですが、スクリプト内から「Called」メソッドを呼び出すことができるようにしたいのですが、できません:

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.CSharp;

namespace scriptingTest
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            var csc = new CSharpCodeProvider ();

            var res = csc.CompileAssemblyFromSource (
                new CompilerParameters ()
                {
                    GenerateInMemory = true
                },
                @"using System; 
                    public class TestClass
                    { 
                        public int testvar = 5;
                        public string Execute() 
                        { 
                            return ""Executed."";
                        }
                    }"
            );

            if (res.Errors.Count == 0) {
                var type = res.CompiledAssembly.GetType ("TestClass");
                var obj = Activator.CreateInstance (type);
                var output = type.GetMethod ("Execute").Invoke (obj, new object[] { });
                Console.WriteLine (output.ToString ());

                FieldInfo test = type.GetField ("testvar");
                Console.WriteLine (type.GetField ("testvar").GetValue (obj));
            } else {
                foreach (var error in res.Errors)
                    Console.WriteLine(error.ToString());
            }
            Console.ReadLine ();
        }

        static void Called() // This is what I would like to be able to call
        {
            Console.WriteLine("Called from script.");
        }
    }
}

私は Mono でこれを行おうとしていますが、これが解決方法に影響するとは思いません。

4

1 に答える 1

2

変更する必要があるものがいくつかあります。

MainClass他のアセンブリにアクセスできるようにCalledする必要があるため、それらを作成しますpublic。さらに、現在のアセンブリへの参照を追加して、スクリプト コードでアクセスできるようにする必要があります。したがって、基本的にコードは次のようになります。

public class MainClass

public static void Called()

var csc = new CSharpCodeProvider();
var ca = Assembly.GetExecutingAssembly();
var cp = new CompilerParameters();

cp.GenerateInMemory = true;
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("mscorlib.dll");
cp.ReferencedAssemblies.Add(ca.Location);

var res = csc.CompileAssemblyFromSource(
    cp,
    @"using System; 
        public class TestClass
        { 
            public int testvar = 5;
            public string Execute() 
            { 
                scriptingTest.MainClass.Called();
                return ""Executed."";
            }
        }"
);

テストの実行結果は次のようになります。

スクリプトから呼び出されます。
実行しました。
5

于 2013-02-19T17:37:29.040 に答える