如何将我的 c# 代码逻辑(if-else-loops)导出到文本文件(例如 XML)中,然后重新导入并运行

本文关键字:例如 XML 然后 运行 导入 新导入 文件 代码 我的 if-else-loops 文本 | 更新日期: 2023-09-27 18:30:37

我每周都有来自客户的这些要求,用于一些新的逻辑或验证。为此,我必须编写新的逻辑(基本上是一些if-else和循环)并为他启动一个新的版本。我想通过简单地在Visual Studio中编写逻辑,然后编写一个实用程序将其导出为XML或其他内容并通过电子邮件将其发送给客户端来避免它。他只需要将此文件放在某个适当的文件夹中,应用程序的行为就会考虑此逻辑。请提出一些解决方案。我的平台是 C# Asp.Net。谢谢

如何将我的 c# 代码逻辑(if-else-loops)导出到文本文件(例如 XML)中,然后重新导入并运行

使用 .

NET 4.6 和 NuGetPackage Microsoft.CodeAnalysis.Scripting,可以实现脚本引擎来运行驻留在文本文件中的 C# 代码,而无需生成程序集。

安装 NuGet 包:

安装包 Microsoft.代码分析.脚本.CSharp

使用一些基本的 C# 代码内容实现 TestClass:

    class Program
    {
        static void Main(string[] args)
        {
            TestScript();
        }
        private static async void TestScript()
        {
            // Code snippet: a class with one string-property.
            string codeContent = @" using System;
                                    public class ScriptedClass
                                    {
                                        public string HelloWorld { get; set; }
                                        public ScriptedClass()
                                        {
                                            HelloWorld = ""Hello Roslyn!"";
                                        }
                                    }
                                    new ScriptedClass().HelloWorld";
            // Instanciate CSharpScriptEngine
            var engine = new CSharpScriptEngine();
            // Execute code and return string property (HelloWorld)
            var scriptingState = await engine.ExecuteAsync(codeContent);
            // Print return value from CSharpScript
            Console.WriteLine("Returned from CSharpScript: {0}", scriptingState.ReturnValue);
            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }
    }

实现脚本引擎:

            internal sealed class CSharpScriptEngine
            {
                public async Task<ScriptState<object>> ExecuteAsync(string codeContent)
                {
                    // Add references from calling assembly
                    ScriptOptions options = ScriptOptions.Default.AddReferences(Assembly.GetExecutingAssembly());
                    // Run codeContent with given options
                    return await CSharpScript.RunAsync(codeContent, options);
                }
            }

从文本文件中读取脚本代码:

所以基本上你可以从你选择的文本文件中读取一些csharpcode并即时运行它们:

        private static async void TestScript()
        {
            // Read in script file
            string codeContent = File.ReadAllText(@"C:'Temp'CSharpScriptTest.cs");
            var engine = new CSharpScriptEngine();
            // Run script
            var scriptingState = await engine.ExecuteAsync(codeContent);
            Console.WriteLine("Returned from CSharpScript: {0}", scriptingState.ReturnValue);
            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }

如果您想知道所有这些如何在后台工作,Roslyn 将从您的脚本代码创建一个所谓的提交。提交是一个内存中的程序集,其中包含围绕脚本代码生成的类型,可以通过名称中的 R 前缀在当前 AppDomain 中的程序集中标识这些类型。

精确的实现细节在这里并不重要(尽管,例如,scriptcs 在很大程度上依赖于对 Roslyn 如何提供其额外功能的详细理解),但重要的是要知道提交可以链接在一起。当它们被链接时,早期提交中定义的变量、方法或类可用于后续提交,从而创建 C# REPL(读取-评估-打印循环)的功能。

C# 和 Visual Basic - 使用 Roslyn 为您的 API 编写实时代码分析器

希望对你有帮助