c# - 在 Visual C# 中运行时编译
问题描述
我正在学习使用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.
}
}
}
解决方案
试试这个:
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";
}
}
}
推荐阅读
- python - QThread 中的 run() 未完全执行
- flutter - Flutter:如何根据条件更改按钮背景颜色
- python-3.x - connection.recv 缓冲区的不完整输出
- python-3.x - Python-audiodiff 安装
- asp.net-core - 使用 ASP.NET Core 的锚标记助手中的自定义路由
- matlab - 如何使用“求解”函数在 MATLAB 中提取二次方程的正解?
- flutter - 无法在颤振中使用 GetIt 初始化共享首选项
- python - 用字典数据中的字典测试 Django
- ruby - 我试图在 ruby 中制作一个二维数组,该数组基本上用作跟踪库存的 excel 表
- node.js - nodejs -nodemailer 在允许不太安全的应用程序访问后无法发送电子邮件