使用codedom控制临时文件的使用

时间:2012-08-08 16:36:17

标签: .net vb.net memory codedom

我正在使用.net和codedom在我想避免(或最好是消除)文件系统访问的环境中。

我目前的代码:

Private Sub ProcessCommand(ByVal command As String)
    Dim MyProvider As New VBCodeProvider 
    Dim cp As New CompilerParameters     
    cp.GenerateExecutable = True        
    cp.GenerateInMemory = True           
    Dim TempModuleSource As String = command

    cp.ReferencedAssemblies.Add("System.dll") 
    cp.ReferencedAssemblies.Add("System.Windows.Forms.dll") 
    cp.IncludeDebugInformation = False

    Dim cr As CompilerResults = MyProvider.CompileAssemblyFromSource(cp, TempModuleSource)
    If cr.Errors.Count > 0 Then

        Throw New ArgumentOutOfRangeException("Invalid Expression - please use something VB could evaluate")
    Else

        cr.CompiledAssembly.EntryPoint.Invoke(Nothing, Nothing)
    End If
End Sub

我很惊讶地看到GenerateInMemory = True并没有真正让它在内存中生成。相反,二进制文件被编译并存储在临时文件中。有没有办法强制encodeom将输出存储在内存中?也许通过强制二进制文件不使用临时文件?

1 个答案:

答案 0 :(得分:1)

这不是一个选项,当前的VB.NET和C#编译器(vbc.exe和csc.exe)只能生成到磁盘的程序集。这可能会在Roslyn项目发布的某一天发生变化,但那是未来的音乐。

这根本不会影响编译或程序集加载的效率,程序从内存中加载程序集。文件系统缓存负责处理这个问题。