卸载CodeDom编译的程序集

10

我有一些C#代码(称之为“脚本”), 我正在运行时编译它。它使用我的主程序中的一个接口来访问其函数。一旦编译完成,我就有了CompilerResults.CompiledAssembly,此时我可以使用CreateInstance(Type)

当我使用完脚本后,我想要完全卸载它。据我所知,只有在创建一个单独的应用程序域时才能这样做: 将DLL加载到单独的AppDomain中

我有一些关于我实现的问题:

  1. 如果我有多个要编译并希望独立卸载的脚本,我是否需要为每个脚本创建单独的应用程序域?
  2. 我应该使用什么应用程序域名称? GUID是否是一个好主意? 是否有任何可能会冲突的名称应该避免使用?
  3. 如果程序集在单独的应用程序域中,它访问主程序中的接口是否会有任何问题? 我目前在编译之前执行的是ReferencedAssemblies.Add(typeof(Interface).Assembly.Location)
  4. 我可以使用CompilerParameters GenerateInMemory=true吗,还是必须将其保存在某个地方?
1个回答

2

按顺序回答:

  1. 是的,如果您想要独立卸载它们,您需要使用单独的应用程序域。
  2. 使用任何东西都可以。如果您可以将其标识回脚本,则在调试时可能会有所帮助,但这更适用于执行线程。
  3. 只要将域设置的基本路径设置为您自己的路径,就不会太长。

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

  4. 不,您不需要保存它,而且听起来也不会对您有什么好处。


我在使用过程中遇到了一些问题,所以我进行了更多的研究。看起来我需要做更多的工作才能让它正常运行:http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load-and-Unload-Code/. 除非后续版本有什么新的东西? - Nelson Rothermel
看起来我很幸运。由于我正在使用.NET 3.5,因此我可以使用托管可扩展性框架。当然,现在我必须去学习它。 :) - Nelson Rothermel
1
看起来我陷入了比我想象中更深的境地。MEF实际上无法卸载程序集,因为它不使用单独的AppDomain。MAF(System.AddIn)可以,但使用起来要复杂得多。MAF和MEF可以一起使用。虽然我真的想能够卸载程序集,但我认为这至少要等到第二个版本。 - Nelson Rothermel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接