有什麼辦法加載.txt文件作爲一個類,然後我的主程序可以調用函數?我基本上試圖將mod支持添加到我的簡單應用程序,用戶可以從每個文件中選擇選項。該文件遵循類似(但不是相同)的格式,並在主程序中調用一堆空白(函數)。C# - 加載一個文本文件作爲一個類
我該怎麼做?甚至有可能做(可能不是,回答我自己的問題?),考慮到它不會與程序的其餘部分一起編譯?
謝謝!
有什麼辦法加載.txt文件作爲一個類,然後我的主程序可以調用函數?我基本上試圖將mod支持添加到我的簡單應用程序,用戶可以從每個文件中選擇選項。該文件遵循類似(但不是相同)的格式,並在主程序中調用一堆空白(函數)。C# - 加載一個文本文件作爲一個類
我該怎麼做?甚至有可能做(可能不是,回答我自己的問題?),考慮到它不會與程序的其餘部分一起編譯?
謝謝!
見我回答這個問題:Compile a C# Array at runtime and use it in code?
從本質上講,你想拉你的文本文件到的CodeDOM和編譯。之後,創建一些動態方法作爲執行助手可能會有所幫助。
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");
StringBuilder sb = new StringBuilder();
// The string can contain any valid c# code
sb.Append("namespace Foo{");
sb.Append("using System;");
sb.Append("public static class MyClass{");
sb.Append("}}");
// "results" will usually contain very detailed error messages
var results = csc.CompileAssemblyFromSource(cp, sb.ToString());
另外,請參閱本主題:Implementing a scripting language in C#。 IronPython與DLR可能適合您的需求。
使用,處理插件
一個框架託管擴展框架正是你要找的
託管擴展框架(MEF)是一個組合物層爲.NET提高了大型應用程序的靈活性,可維護性和可測試性。 MEF可以用於第三方插件的可擴展性,或者它可以將鬆散耦合的插件式架構的優點帶給常規應用程序。
MEF提供了一個定義良好的架構來支持應用程序中的插件。
DLL與文本(源代碼)
插件顯影劑預計提供一種含有該插件代碼的DLL。但是,如果需要,您可以使用Roslyn將源代碼編譯爲DLL。請記住,如果你想支持接收插件源代碼,你還必須提供支持來幫助用戶處理編譯錯誤並在你的框架中調試插件。要求他們提供DLL可能更爲明智。
這是否可以使用.txt文件作爲類?我認爲他需要實質性編譯它 – Prescott 2012-07-31 23:41:58
@Prescott:更新了我的答案以解決這一問題。 – 2012-07-31 23:45:13
有關此任何更新? – 2016-06-20 16:29:47
您可以加載文本文件,然後使用一些編譯器即服務(Microsoft's pre-release Roslyn project或Mono.CSharp)。然後,您可以將編譯後的輸出結果在程序中運行。
如果完全有可能讓用戶接收一個已編譯的程序集而不是未編譯的源文件,則應考慮Managed Extensibility Framework或Mono.Addins。
第二種方法(擴展程序集)對我來說似乎更好,至少有兩個原因:1)您的用戶可以使用任何開發環境,以確保其代碼在交給您之前正確編譯; 2 )你需要做更少的工作來驗證輸入和處理失敗。
這是可能的,但你必須調用C#編譯器..不平凡。更容易要求你的mod被編譯成dll,然後你可以加載並用反射調用。 – Blorgbeard 2012-07-31 23:40:21
可能需要考慮使用Roslyn – Prescott 2012-07-31 23:40:50