2016-12-16 85 views
-2

我有一個使用的對象從具有看起來像這樣方法的類C#程序:使用C#,允許用戶編寫自己的方法

public double TheMethod(double argument1, double argument2, ...,double argumentN) 
{ 
    //method body: do something with the arguments 
    //return the result 
} 

我想給用戶編寫的能力將自己的邏輯放入方法體中,然後在程序運行時使用它們。

在我看來,腳本可能是要走的路,但我無法嘗試開始。處理這種情況的最佳方式是什麼?

注意:如果它很重要,程序將從一個更大的主桌面應用程序中運行。我希望用戶能夠在應用程序已經運行某種編輯器程序時編寫代碼。他們的代碼會在啓動實際使用該方法的程序後被保存和使用。

+0

已經有很多關於這個主題的問題和文章 - https://www.bing.com/search?q=c%23+scripting(或者任何其他搜索引擎,你喜歡Yahoo,Yandex,... as據推測谷歌是不夠的)。 「嘗試啓動{scripting}的麻煩」很難解釋你實現許多提議中的一個的問題 - 如果你在設置腳本時遇到了特殊問題,最好問問這個問題。 –

回答

1

如果您希望您的用戶使用c#編寫,最簡單的方法可能是將文件(或至少是方法體)換出不同的副本,並在每次運行之前重新編譯子應用程序。

在運行時可以做一個方法體的實時替換,但這不是爲了輕鬆! https://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx

如果你很高興做的工作,以創建自己的小型腳本語言,看看ANTLR的http://www.antlr.org/

+0

Reflection.Emit是完全不同的故事,並將建設編譯器... –

+0

@AlexeiLevenkov謹慎解釋你的陳述?在他的鏈接之後,文檔中寫道:「這些類的主要客戶端是**腳本引擎**和編譯器。」它不正確嗎? – Skyqula

1

你當然可以動態地編譯和執行C#。請參閱Is it possible to dynamically compile and execute C# code fragments?

根據您的用戶是誰以及他們的腳本如何集成到更廣泛的應用程序,IronPython可能是一個更好的選擇 - 本質上是使用python編寫腳本。有關集成C#和IronPython的詳細信息,請參閱https://blogs.msdn.microsoft.com/charlie/2009/10/25/running-ironpython-scripts-from-a-c-4-0-program/

與往常一樣,當從外部源運行任何動態注入的代碼時,請考慮安全性。

+0

IronPython的建議看起來很有希望。你知道這將如何影響速度?例如,如果我在IronPython中編寫與源代碼中相同的方法體邏輯,那麼IronPython實現會明顯變慢嗎? – user57029

+0

使用任何動態編譯的代碼,當編譯代碼時,您將需要額外的時間,無論是C#還是IronPython。 http://stackoverflow.com/questions/3081661/speed-of-code-execution-ironpython-vs-c會表明IronPython較慢,但它可能取決於情況。您的用戶注入多少代碼?如果C#中的執行時間是5秒,IronPython中的執行時間是7秒,那麼這2秒是否有差別?沒有上下文,很難說。 – user783836

相關問題