0

我正在使用 .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 并没有真正让它在内存中生成。相反,二进制文件被编译并存储在一个临时文件中。有没有办法强制codedom将输出存储在内存中?也许通过强制二进制文件不使用临时文件?

4

1 回答 1

1

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

这根本不会影响编译或程序集加载的效率,您的程序将从内存中加载程序集。文件系统缓存负责这一点。

于 2012-08-08T17:14:40.600 回答