Я пытаюсь создать КИ или что-то, что больше похоже на Бота, который может немного учиться.Например, я хочу дать ему новые команды.Поэтому бот должен создавать новые методы из-за времени выполнения, чтобы он мог реагировать на мои входные данные правильным методом.Я хотел знать, если и как можно добавить метод в мой существующий класс во время выполнения.
Я уже нашел несколько ссылок и примеров, таких как CodeDomProvider
, CSharpCodeProvider
и DynamicMethod
, но кажется, что они могут только создавать новые исполняемые файлы (exe-файлы) или создавать пресеты, которые можно выполнитьс новыми параметрами.
Мне нужен способ создания нового метода в моем существующем классе или способ взаимодействия с моим существующим классом.Я уже думал о плагинах, но, по моему мнению, было бы много работы для создания плагина для каждого метода, а также неэффективно, я прав?
Вы также можете узнать лучший способ, чем создавать методы для каждой команды?
Редактировать 1:
С помощью Assembly.CreateInstane("path");
я мог бы «клонировать» мою работающую программу, и вместе с CSharpCodeProvider я мог бы создать новый exe-файл с помощью этих методов.Но есть проблема.Когда я использую метод, в котором нет ссылки на класс, например using System.Windows.Forms
, выдает ошибку:
Строка № 3, номер ошибки: CS0234, «Имя типа или пространства имен« Windows »не существует в пространстве имен 'System'.(Ссылка на сборку отсутствует?);
Это был бы мой тест-код прямо сейчас:
//The String I am going to Add through my textfield
using System;
using System.Reflection;
using System.Windows.Forms;
public class Example
{
public static void Main()
{
Assembly assem = typeof(View).Assembly;
View v = (View ) assem.CreateInstance("Usopis");
if (! (v == null)) {
v.Height = 300;
MessageBox.Show("Instantiated a {0} object whose value is '{1}'",
v.GetType().Name, v);
}
else {
MessageBox.Show("Unable to instantiate a View object.");
}
}
}
//Code which should compile my String to a exe
private void Button_Click(object sender, EventArgs e) {
textBox2.Text = "";
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text);
if(results.Errors.Count > 0) {
textBox2.ForeColor = Color.Red;
foreach(CompilerError CompErr in results.Errors) {
textBox2.Text = textBox2.Text +
"Line number " + CompErr.Line +
", Error Number: " + CompErr.ErrorNumber +
", '" + CompErr.ErrorText + ";" +
Environment.NewLine + Environment.NewLine;
}
} else {
//Successful Compile
textBox2.ForeColor = Color.Blue;
textBox2.Text = "Success!";
}
}