2012-04-04 104 views
0

我記得使用InterSystems Cache代碼時,可以使用間接方式獲取一個字符串,並通過在字符串變量前加「@」將其轉換爲真正的可執行代碼。這可以在C#.NET或VB.NET代碼中完成嗎?所以我希望有一個方法可以接受一個字符串參數數組(帶有一行或多行代碼),並運行該代碼,假設它沒有拋出異常。我要去哪裏?我想在.NET代碼中編寫一個編譯器。你可以在.NET中執行代碼間接嗎?

SET x="set a=3" XECUTE x ; sets the public variable a to 3 

OR 

SET x="tag1" d @x ; do/call the public subroutine tag1 

OR 

Set Y = "B",@Y = 6 ; sets public variable B = 6 
+2

看看Roslyn http://msdn.microsoft.com/en-us/roslyn – cordialgerm 2012-04-04 05:40:45

+0

我喜歡這種不明確的Caché是如何挑選的,例如間接性。你是否碰巧爲一家醫療保健公司工作? – 2017-03-23 17:17:32

+0

哈哈!是的,我在Epic工作了5.5年。你也是? – MacGyver 2017-03-23 20:03:55

回答

1

我假設你想在運行時編譯。
System.CodeDom和System.CodeDom.Complier命名空間包含與運行時編譯相關的接口。
對於您自己的語言,您需要從派生類CodeDomProvider實現您的派生類。

+0

酷!這相當於從命令行調用csc *嗎?或從.NET代碼中運行msbuild * .sln .. – MacGyver 2012-04-04 05:55:52

+1

這是腳本編寫 - 因此這是運行時編譯。
csc表示編譯期間的本地編譯。 – weismat 2012-04-04 06:07:16

+0

你是否推薦使用這個命名空間的一些有聲望的例子的任何引用/鏈接?我會在這段時間玩弄它。 – MacGyver 2012-04-04 21:05:31

1

對於.NET,您可以使用System.CodeDom以編程方式構建代碼,該代碼基本上是中間語言的包裝,也可以使用System.CodeDom.Compiler獲取將字符串(或文件)編譯爲一個使用C#或VB.NET編譯器的可執行文件或DLL。

編譯字符串更像是Intersystems Cache的做法,但它還有更多的工作,因爲您必須提供編譯器所需的全部信息。如果你看看the CompilerParameters class,你會看到增加的複雜性。編譯後的代碼將在它自己的程序集中。一個程序集不能被卸載,除非它在它自己的應用程序域中,並且動態編譯它時很困難,大多數人不會爲避免它而煩心。

提出了各種解決問題的方法on this very site

如果鏈接處於活動狀態,則可以找到您描述的某個解決方案的某些源代碼here

+0

在Java中可能嗎? :-) – MacGyver 2012-04-26 07:26:15

相關問題