c# - 即时添加新的 cs 文件以加载我正在运行的应用程序?

标签 c# .net

我有一个命令处理程序,它基本上是这样工作的:

ControlList.Handlers[CommandType.MyCommandComesHere].Handle(data);

HandlersDictionary<CommandType, ICommandHandler>CommandType是一个枚举。

Handle轮到它会导致它:

using System;
using log4net;

namespace My_Application
{
    public class MyCommand : ICommandHandler
    {
        private static readonly ILog Logger = LogManager.GetLogger(typeof(MyCommand));

        public void Handle(Events data)
        {
            Console.WriteLine("I can load cs files on the fly yay!!");
        }
    }
}

我的问题是我怎样才能让我的应用程序编译并让我在它运行时使用该 cs 文件?

任何简单的例子都将不胜感激,但只要我能得到一些关于我需要寻找什么的指示,我将不胜感激,因为我什至不确定我需要什么才能实现这一目标。

简而言之,我目前正在尝试了解如何将 cs 文件加载到已编译且当前正在运行的应用程序中。

最佳答案

使用CodeDOM,需要先创建a compiler provider . (出于您的目的,您可能希望将 GenerateExecutable 设置为 false 并将 GenerateInMemory 设置为 true。)

    var csc = new CSharpCodeProvider();
    var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.exe", true);
    parameters.GenerateExecutable = false;
    parameters.GenerateInMemory = true;

然后,您可以使用 CompileAssemblyFromSource 编译程序集并得到 CompilerResults从它返回。从此返回的对象中,使用其 CompiledAssembly 获取对生成的程序集的引用属性(property)。

    var results = csc.CompileAssemblyFromSource(parameters, "contents of the .cs file");
    var assembly = results.CompiledAssembly;

然后你可以使用反射来create instances从该程序集调用它们的方法。

    var instance = assembly.CreateInstance("MyCommand");
    // etc...

或者,如果您只对短代码片段感兴趣,可能值得 use Roslyn反而。您需要创建一个 ScriptEngine第一的。

var engine = new ScriptEngine();

然后你可以Execute上面的字符串 - 或 Execute<T>如果您确信字符串中的表达式返回可分配给 T 的类型.

var myObject = engine.Execute("1+1");
var myInt = engine.Execute<int>("1+1");

它绝对更直接,因此值得研究它是否符合您的目的。

关于c# - 即时添加新的 cs 文件以加载我正在运行的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322997/

相关文章:

c# - Sanitizer.GetSafeHtmlFragment 是否应该删除 <br> 元素?

c# - 启用审计和威胁检测选项后,如何在 Azure SQL 数据库中测试威胁检测事件?

c# - 用 ?? 实例化空对象运算符(operator)

.net - .NET 中的 DataSet 和 DataTable 有什么区别?

.net - 何时使用 ExternallyControlledLifetimeManager?

c# - 使用 MVC5 更新 EF5 中的 Db

c# - 在 C# 中将 IEnumerable<T> 转换为 List<T> 的最快方法

.net - 将大型资源文件物理拆分为多个文件,而编译器将其视为一个文件

c# - C# 中的序列化和对象版本控制

c# - NServiceBus 处理程序抛出元数据错误