簡體   English   中英

在內存中生成的程序集上使用System.Addin

[英]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提到的事情。 你可以:

  1. 更改您的編譯器類以從MarshalByRefObj派生。 CLR必須創建代理對象。 您將需要檢查一下.Net Remoting。 雖然不是太多。
  2. 創建自己的AppDomain,
  3. 最后,調用CreateInstanceFromAndUnwrap的重載之一,以在新AppDomain上的編譯器類中加載組裝,並在其上創建編譯器的實例。 它將返回給您代理對象。 然后使用代理對象進行實際的編譯。 編譯后的程序集將被加載到新的AppDomain上。 當您決定不再需要該程序集或達到最大數量的已編譯程序集時,可以進行MZN提及的調用,並卸載AppDomain和所有已加載的程序集。 然后,從新的AppDomain再次重復整個過程。

我認為最簡單的方法是使用IronPython。

在那時,我正在研究基於MAF的應用程序,其中包括現場編譯C#代碼(使用System.CodeDom)。 它與您的相似,但就我而言,編譯僅在升級后進行。 因此,加載許多“腳本”程序集都沒有問題。 另外,我在文件系統上構建程序集。

祝您好運,

Panos

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM