2009-09-22 116 views
10

我有一些C#代碼(我們稱之爲「腳本」)我在運行時編譯。它使用我用來訪問其功能的主程序中的一個接口。編譯完成後,我有CompilerResults.CompiledAssembly,在這種情況下,我可以CreateInstance(Type)卸載CodeDom編譯程序集

一旦我完成了使用腳本,我想完全卸載。據我瞭解,我只能這樣做,如果我創建一個單獨的應用程序域: Loading DLLs into a separate AppDomain

我有一些專門針對我的執行問題:

  1. 如果我有多個腳本編譯並想卸載他們獨立,我必須爲每個創建單獨的應用程序域?
  2. 我應該使用哪些應用程序域名? GUID是一個好主意嗎?有什麼名字我應該避免可能衝突?
  3. 如果程序集位於單獨的應用程序域中,它是否會在訪問主程序中的接口時遇到任何問題?編譯前我正在做ReferencedAssemblies.Add(typeof(Interface).Assembly.Location)
  4. 我可以使用CompilerParameters GenerateInMemory=true,還是必須將它保存在某個地方?

回答

2

答案依次是:

  1. 是的,如果你想單獨卸載它們,你需要單獨的應用程序域。
  2. 使用任何。如果您可以將其識別回腳本,它可能會幫助您進行調試,但對於正在執行的線程來說更是如此。
  3. 只要您將域設置的基本路徑設置爲您自己的路徑,

    AppDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

  4. 不,你不需要保存它,它聽起來不像它會對你有益。

+0

我很難讓這個工作,所以我做了一些更多的研究。看起來我需要做更多的工作才能使它工作:http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load -and-卸載碼/。除非在以後的版本中有新的東西? – 2009-09-23 16:18:57

+0

看起來我很幸運。由於我使用.NET 3.5,我可以使用託管擴展框架。當然,我現在必須去了解它。 :) – 2009-09-23 16:42:03

+1

看起來我得到了比我想要的更深的預期。 MEF實際上不能卸載程序集,因爲它不使用單獨的AppDomain。 MAF(System.AddIn)可以,但使用起來要複雜得多。 MAF和MEF可以一起使用。雖然我真的希望能夠卸載程序集,但我認爲這至少需要等待第2版。 – 2009-09-23 20:03:13