[英]How can I create an object which acts as a “contract” for data (e.g an integer) to be placed there later?
[英]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.