簡體   English   中英

如何將c#代碼邏輯(if-else-loops)導出到文本文件(例如XML)中,然后再導入回來並運行?

[英]How can I export my c# code logic (if-else-loops) in to text files (e.g XML) and later import it back and run?

我每周都有來自客戶的這些要求,以進行一些新的邏輯或驗證。 為此,我必須編寫新的邏輯(基本上是一些if-else和loops)並為他啟動一個新版本 我想通過在Visual Studio中簡單地編碼我的邏輯,然后編寫一個實用程序以將其導出為XML或通過電子郵件將其發送給客戶端的方法來避免這種情況。 他只需要將此文件放在某個適當的文件夾中,應用程序將根據此邏輯進行操作。 請提出一些解決方案。 我的平台是C#Asp.Net 謝謝

使用.NET 4.6和NuGetPackage Microsoft.CodeAnalysis.Scripting,您可以實現腳本引擎來運行駐留在文本文件中的c#代碼,而無需構建程序集。

安裝NuGet軟件包:

安裝包Microsoft.CodeAnalysis.Scripting.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();
        }
    }

實現一個ScriptingEngine:

            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);
                }
            }

從文本文件讀取ScriptCode:

因此,基本上,您可以從您選擇的文本文件中讀取一些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將根據您的腳本代碼創建一個所謂的提交。 提交是內存中的程序集,其中包含圍繞您的腳本代碼生成的類型,可以通過名稱中的be前綴在當前AppDomain的程序集中進行識別。

確切的實現細節在這里並不重要(盡管例如,腳本非常依賴於詳細了解Roslyn如何工作以提供其額外功能),但是重要的是要知道提交可以鏈接在一起。 當將它們鏈接在一起時,早期提交中定義的變量,方法或類可用於后續提交中,從而創建了C# REPL (讀取-評估-打印循環)的功能。

C#和Visual Basic-使用Roslyn為您的API編寫實時代碼分析器

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM