[英]Using System.Addin with Assembly generated in memory
我有一個必須向用戶提供即時擴展性的應用程序。 您可以將其視為一種具有大量數據和一些數學/數值算法的計算引擎。 我提供了一些靜態字段(數據)和方法(計算),用戶可以使用它們構建有效的C#表達式,該表達式應返回一個double。
用戶在文本框中鍵入有效的表達式,我應該提供結果。 我目前要做的是按照http://blogs.msdn.com/b/abhinaba/archive/2006/02/09/528416中的步驟,將表達式注入內存中生成的程序集的靜態方法上.aspx 。 然后,我使用反射來調用特定方法並返回結果。
除生成的程序集在應用程序的整個生命周期中不斷累積的事實外,此方法都可以正常工作。 當我所有的都是客戶端應用程序時,這是可以的,但是現在我正在遷移到基於服務器的應用程序中,並且我不想不時地重置服務。
在搜索如何卸載程序集時,我發現了System.Addin命名空間。 它恰好實現了我想要的功能:將程序集加載到另一個AppDomain上,我可以將其丟棄。 它甚至封裝了所有反射。
我現在唯一的問題是AddInStore需要一個文件路徑,但是我所有的程序集都是通過將CompileParameters的GenerateInMemory屬性設置為true來在內存中生成的。 將程序集寫入磁盤是否絕對必要? 還是可以將在運行時編譯的程序集直接用作外接程序?
最好的問候,卡洛斯
我不明白您正在使用AddInStore(卸載程序集嗎?),但是您只能卸載appdomain(您說能夠在其中創建動態加載的程序集):
AppDomain.Unload(yourAppDomain);
也許您正面臨更大的問題!
也許DynamicMethod是您要找的東西。
如果沒有,那么您可以看看IronPython 。 添加到您的應用程序非常容易,功能也非常強大。 當然,這將比編譯后的C#代碼慢,但是我不確定它是否會比編譯+反射慢。
當然,您可以做MZN提到的事情。 你可以:
我認為最簡單的方法是使用IronPython。
在那時,我正在研究基於MAF的應用程序,其中包括現場編譯C#代碼(使用System.CodeDom)。 它與您的相似,但就我而言,編譯僅在升級后進行。 因此,加載許多“腳本”程序集都沒有問題。 另外,我在文件系統上構建程序集。
祝您好運,
Panos
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.