我正在学习使用CSharpCodeProvider
,CompilerParameters
,CompilerResults
等运行时编译文件。
我能够通过方法获得字符串的内容。
public static string Test() //This is in the file to be compiled.
{
return "This is a test string!";
}
并使用
MethodInfo main = program.GetMethod("Test"); //This is in the main program.
//program is a Assembly Type generated in another part of the program.
str=main.Invoke(null, null).ToString();
获取字符串。
如何直接获取字符串?如,
public string str="This is a test string!"; //This is in the file to be compiled.
我曾尝试将字符串设为属性并使用GetProperty("str");
,但它得到的只是属性的名称,例如。 str ,我不知道如何获取字符串的内容,例如。 这是一个测试字符串!。
以下是代码:
using System.IO;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
namespace MudOS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = true;
string str = File.ReadAllText(Directory.GetCurrentDirectory() + @"\MudLib\Test.c");
CompilerResults results = provider.CompileAssemblyFromSource(parameters, str);
if (results.Errors.HasErrors)
{
MessageBox.Show("Compiling error!");
return;
}
Assembly assembly = results.CompiledAssembly;
Type program = assembly.GetType("MudOS.Test");
MethodInfo main = program.GetMethod("Test");
resultString=main.Invoke(null, null).ToString();
MessageBox.Show(resultString);
PropertyInfo pinfo = program.GetProperty("str");
MessageBox.Show(pinfo.Name.ToString());
//I want the CONTENT of the string, not the NAME.
}
}
}
以下是在运行时编译的文件:Test.c
using System.Windows.Forms;
namespace MudOS
{
class Test
{
public string testStr="This is a test string!";
//I would like to know if it's possible to get this string directly.
public string str
{
get{ return "This is a test string!"; }
//I was unable to get this content.
}
public static void Main()
{
}
public static string Test()
{
return "This is a test string!";
//I was able to get this content just fine.
}
}
}
答案 0 :(得分:1)
试试这个:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Reflection;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
var type = typeof(MethodContainer);
var method = type.GetMethod("MyMethod");
var mc = new MethodContainer();
string result = (string)method.Invoke(mc, null);
Console.WriteLine(result); //Output: This is a test
}
}
public class MethodContainer
{
public string MyMethod()
{
return "This is a test";
}
}
}
更新:
您必须获取班级的类型(typeof(Your_Clas)
),然后使用GetMethod()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Reflection;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
MethodInfo method = typeof(Program).GetMethod("MyMethod");
string result = (string)method.Invoke(null, null);
Console.WriteLine(result);
}
public static string MyMethod()
{
return "LOL";
}
}
}
答案 1 :(得分:0)
program.getField("testStr").getValue(null).
从程序集中获取Type后尝试此方法。