gpt4 book ai didi

c# - 在运行时编译 C# 数组并在代码中使用它?

转载 作者:太空狗 更新时间:2023-10-30 00:33:29 28 4
gpt4 key购买 nike

I know C# code can be compiled at runtime using C# .但是,自从我几分钟前刚刚读到它以来,我对此非常非常不安。我通过例子学得更好。所以告诉我。如果我想编译类似的东西:

// MapScript.CS
String[] LevelMap = {
"WWWWWWWWWWWWWWWWWWW",
"WGGGGGGGGGGGGGGGGGW",
"WGGGGGGGGGGGGGGGGGW",
"WWWWWWWWWWWWWWWWWWW" };

并在我的代码中使用这个数组,我将如何处理它?<​​/p>

在伪代码中我想做这样的事情:

Open("MapScript.CS");
String[] levelMap = CompileArray("levelMap");
// use the array

最佳答案

LINQ 表达式树可能是执行此操作最友好的方法:可能是这样的:

您还可以使用 OpCodes ( OpCodes.Newarr ) 生成 IL。如果您熟悉基于堆栈的编程,这很容易(否则,可能具有挑战性)。

最后,您可以使用 CodeDom(您的伪代码类似于它),但是——虽然它是最强大的工具——但它不太适合用于快速动态方法。它需要文件系统权限和手动引用解析,因为您与编译器密切合作。

来自 MSDN 的示例

var ca1 = new CodeArrayCreateExpression("System.Int32", 10);                        
var cv1 = new CodeVariableDeclarationStatement("System.Int32[]", "x", ca1);

Source - Creating Arrays with the Code DOM

如果你想要一个直接的字符串原始编译,你可以省略语句的面向对象处理,而只是构建一个大字符串。像这样的东西:

var csc = new CSharpCodeProvider( new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } } );
var cp = new CompilerParameters() {
GenerateExecutable = false,
OutputAssembly = outputAssemblyName,
GenerateInMemory = true
};

cp.ReferencedAssemblies.Add( "mscorlib.dll" );
cp.ReferencedAssemblies.Add( "System.dll" );
cp.ReferencedAssemblies.Add( "System.Core.dll" );

StringBuilder sb = new StringBuilder();

// The string can contain any valid c# code, but remember to resolve your references

sb.Append( "namespace Foo{" );
sb.Append( "using System;" );
sb.Append( "public static class MyClass{");

// your specific scenario
sb.Append( @"public static readonly string[] LevelMap = {
""WWWWWWWWWWWWWWWWWWW"",
""WGGGGGGGGGGGGGGGGGW"",
""WGGGGGGGGGGGGGGGGGW"",
""WWWWWWWWWWWWWWWWWWW"" };" );

sb.Append( "}}" );

// "results" will usually contain very detailed error messages
var results = csc.CompileAssemblyFromSource( cp, sb.ToString() );

关于c# - 在运行时编译 C# 数组并在代码中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748867/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com