我正在使用.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将输出存储在内存中?也许通过强制二进制文件不使用临时文件?
答案 0 :(得分:1)
这不是一个选项,当前的VB.NET和C#编译器(vbc.exe和csc.exe)只能生成到磁盘的程序集。这可能会在Roslyn项目发布的某一天发生变化,但那是未来的音乐。
这根本不会影响编译或程序集加载的效率,程序将从内存中加载程序集。文件系统缓存负责处理这个问题。