2012-07-31 184 views
5

有什麼辦法加載.txt文件作爲一個類,然後我的主程序可以調用函數?我基本上試圖將mod支持添加到我的簡單應用程序,用戶可以從每個文件中選擇選項。該文件遵循類似(但不是相同)的格式,並在主程序中調用一堆空白(函數)。C# - 加載一個文本文件作爲一個類

我該怎麼做?甚至有可能做(可能不是,回答我自己的問題?),考慮到它不會與程序的其餘部分一起編譯?

謝謝!

+0

這是可能的,但你必須調用C#編譯器..不平凡。更容易要求你的mod被編譯成dll,然後你可以加載並用反射調用。 – Blorgbeard 2012-07-31 23:40:21

+0

可能需要考慮使用Roslyn – Prescott 2012-07-31 23:40:50

回答

6

見我回答這個問題:Compile a C# Array at runtime and use it in code?

從本質上講,你想拉你的文本文件到的CodeDOM和編譯。之後,創建一些動態方法作爲執行助手可能會有所幫助。

  • 接收上傳的文件
  • 上的文件
  • 執行任何所需的驗證讀取文件作爲串入的CodeDOM
  • 應付任何的編譯器/結構錯誤
  • 使用LINQ表達式創建的helper方法樹或動態方法,以便新類和現有代碼之間的鏈接與編譯對象橋接(否則,所有新方法都需要使用反射來調用)

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可能適合您的需求。

+0

就是這樣 - 我不一定要編譯它,我只是需要它作爲腳本運行。 – Scott 2012-07-31 23:46:31

+1

我明白了。僅供參考,腳本也編譯,只是在飛行中。根據您的性能需求,動態編譯可能是合適的,儘管c#編譯可能不太適合實時操作。 – 2012-07-31 23:48:25

+0

這看起來非常棒,我會添加它!謝謝! – Scott 2012-07-31 23:54:38

1

使用,處理插件

一個框架託管擴展框架正是你要找的

http://mef.codeplex.com/

託管擴展框架(MEF)是一個組合物層爲.NET提高了大型應用程序的靈活性,可維護性和可測試性。 MEF可以用於第三方插件的可擴展性,或者它可以將鬆散耦合的插件式架構的優點帶給常規應用程序。

MEF提供了一個定義良好的架構來支持應用程序中的插件。

DLL與文本(源代碼)

插件顯影劑預計提供一種含有該插件代碼的DLL。但是,如果需要,您可以使用Roslyn將源代碼編譯爲DLL。請記住,如果你想支持接收插件源代碼,你還必須提供支持來幫助用戶處理編譯錯誤並在你的框架中調試插件。要求他們提供DLL可能更爲明智。

+1

這是否可以使用.txt文件作爲類?我認爲他需要實質性編譯它 – Prescott 2012-07-31 23:41:58

+0

@Prescott:更新了我的答案以解決這一問題。 – 2012-07-31 23:45:13

+0

有關此任何更新? – 2016-06-20 16:29:47

3

您可以加載文本文件,然後使用一些編譯器即服務(Microsoft's pre-release Roslyn projectMono.CSharp)。然後,您可以將編譯後的輸出結果在程序中運行。

如果完全有可能讓用戶接收一個已編譯的程序集而不是未編譯的源文件,則應考慮Managed Extensibility FrameworkMono.Addins

第二種方法(擴展程序集)對我來說似乎更好,至少有兩個原因:1)您的用戶可以使用任何開發環境,以確保其代碼在交給您之前正確編譯; 2 )你需要做更少的工作來驗證輸入和處理失敗。

+0

謝謝!我會看看羅斯林,有幾條評論在談論這件事。 – Scott 2012-07-31 23:45:05

+2

不要低估Mono.CSharp - 這是一個「完成的產品」,它的界面你可以期望不會改變。 Roslyn的界面在當前的CTP狀態和最終的RTM之間很可能會發生變化。一旦它接近發貨,Roslyn可能是一個典型的.NET項目的更合適的選擇,但請記住,Mono程序集與其他程序集一樣運行在微軟的CLR上。 – sblom 2012-07-31 23:48:03

相關問題