【发布时间】:2011-12-08 22:34:26
【问题描述】:
我目前正在努力使用 CodeDOM 代码生成器并执行已编译的程序集。 一切都像一个魅力,除了第二次运行编译的代码。
设置
用户“编程”一个模型,该模型将被翻译成可执行程序。用户可以定义程序集是仅在内存中创建还是在磁盘上创建,是否具有源代码或只有可执行文件。当他单击“运行”按钮时,CodeDOM 树被组合并编译,写入磁盘(如果需要)并执行。
例外
当他第二次点击“运行”按钮时,抛出异常:
错误 CS0016: 无法写入输出文件 '': -- “该进程无法访问该文件,因为它正被 另一个进程。”
由于我可以根据需要随时编译代码而不会遇到错误,因此我建议它与我运行程序集的方式有关。我在网上搜索了有关此主题的信息,但我想出的只是创建一个单独的 AppDomain 并在之后卸载它。
这是执行程序集的 sn-p:
if ( RunProject )
{
_log.info( "Compiled without errors, running..." );
Assembly compiledAssembly = res.CompiledAssembly;
AppDomain compiledAssemblyDomain = AppDomain.CreateDomain( "compiledAssemblyDomain" );
compiledAssemblyDomain.ExecuteAssemblyByName( compiledAssembly.GetName( ) );
AppDomain.Unload( compiledAssemblyDomain );
}
只有退出程序才能删除可执行文件,好像文件被当前的appdomain锁定了一样。该怎么办?感谢您的帮助!
更新
当上面的代码执行时,主文件被加载到正在执行的程序集中(或者我错了吗?)。调试控制台捕获以下信息:
[13:42:19.5576171] i Compiled without errors, running...
'XXX.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\bin\main.exe'
退出执行的程序集仅几秒钟后:
The thread '.NET SystemEvents' (0x20d0) has exited with code 0 (0x0).
The thread '<No Name>' (0x1d20) has exited with code 0 (0x0).
XXX 是我编译代码的主应用程序的名称。文件不应该加载到其他地方吗? XXX.vshost.exe不是打开一个句柄,卸载AppDomain后不关闭吗?
【问题讨论】:
标签: c# code-generation appdomain codedom