我希望将我目前拥有的脚本解决方案转移到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中这样做,但是,我不相信这会影响如何解决这个问题。
答案 0 :(得分: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