是否可以在 C# 运行时创建/执行代码?

发布于 2024-11-02 00:58:57 字数 701 浏览 2 评论 0原文

我知道您可以 使用 Emit、System.Reflection 动态创建 .NET 程序集并手动创建 IL 代码,如下所示

但我想知道是否可以在正在运行的应用程序中实时动态创建和执行 C# 代码块。感谢您的任何意见或想法。

编辑: 据我了解,CodeDOM 允许您将 C# 代码编译成 EXE 文件,而不是“仅仅”执行它。以下是一些背景信息以及为什么(据我所知)这对我来说不是最佳选择。我正在创建一个应用程序,该应用程序必须多次执行此类动态创建的代码[郑重声明 - 这是用于学术研究,而不是现实世界的应用程序,因此这是不可避免的]。因此,创建/执行数千个动态创建的 EXE 并不是真正高效。其次 - 所有动态代码片段都会返回一些难以从单独运行的 EXE 中读取的数据。如果我遗漏了什么,请告诉我。

至于 DynamicMethod 方法,Jon Skeet 指出,如果有一种更简单的方法来编写代码本身而不是低级 IL 代码,那么一切都会像魅力一样工作。

换句话(非常严厉地说)我需要这样的东西:

string x = "_some c# code here_";
var result = Exec(x);

I know you can dynamically create a .NET assembly using Emit, System.Reflection and manually created IL code as shown here.

But I was wondering is it possible to dynamically create and execute C# code block real-time, in a running application. Thanks for any input or ideas.

Edit:
As I understand CodeDOM allows you to compile C# code into EXE file rather than "just" executing it. Here's some background information and why (as far as I can tell) this isn't the best option for me. I'm creating an application that will have to execute such a dynamically created code quite a lot [for the record - it's for academic research, not a real-world application, thus this cannot be avoided]. Therefore, creating/executing thousands of dynamically created EXEs aren't really efficient. Secondly - all dynamic code fragments returns some data that is hard to read from separately running EXE. Please let me know if I'm missing something.

As for DynamicMethod approach, pointed out by Jon Skeet, everything would work like a charm if there would be an easier way to write the code itself rather than low level IL code.

In other words (very harshly speaking) I need something like this:

string x = "_some c# code here_";
var result = Exec(x);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

划一舟意中人 2024-11-09 00:58:57

绝对 - 这正是我为 Snippy 所做的,例如,为 C# in Depth 所做的。您可以在此处下载源代码 - 它使用CSharpCodeProvider

还可以使用 DynamicMethod,或者 .NET 4 中的 DLR...各种各样的东西。

Absolutely - that's exactly what I do for Snippy for example, for C# in Depth. You can download the source code here - it uses CSharpCodeProvider.

There's also the possibility of building expression trees and then compiling them into delegates, using DynamicMethod, or the DLR in .NET 4... all kinds of things.

小耗子 2024-11-09 00:58:57

是的。有几个应用程序可以做到这一点 - 请参阅 LinqPadSnippy

我相信他们使用 CSharpCodeProvider

Yes, it is. There are several applications that do just that - see LinqPad and Snippy.

I believe they use the CSharpCodeProvider.

妳是的陽光 2024-11-09 00:58:57

是的。请参阅有关使用 CodeDOM 的此 MSDN 页面

从上面提到的页面中提取的一些示例代码:

CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( 
    new CodeTypeReferenceExpression("System.Console"), 
    "WriteLine", new CodePrimitiveExpression("Hello World!") );
start.Statements.Add(cs1); 

Yes. See this MSDN page regarding using the CodeDOM.

Some example code extracted from the above mention page:

CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( 
    new CodeTypeReferenceExpression("System.Console"), 
    "WriteLine", new CodePrimitiveExpression("Hello World!") );
start.Statements.Add(cs1); 
初见 2024-11-09 00:58:57

您可以使用 CodeDom 生成代码并根据生成的代码在内存中创建程序集。然后可以在当前应用程序中使用它们。

这是 msdn 参考的快速链接,内容非常丰富。

MSDN:使用 CodeDom

You can Use CodeDom to generate code and create in memory assemblies based on that generated code. THose can then be used in the current application.

Here's a quick link to the msdn reference, it is quite extensive material.

MSDN: Using the CodeDom

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文