首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

动态代码编译解决办法

2012-04-20 
动态代码编译我想要动态执行文本输入的代码:已经写好的编译程序,如下Imports System.CodeDom.CompilerPubl

动态代码编译
我想要动态执行文本输入的代码:

已经写好的编译程序,如下
Imports System.CodeDom.Compiler
Public Class calcul
  Public Property WindowStyle As ProcessWindowStyle
  Dim resultat As Double
  Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim referenceAssemblies As String() = {"System.Windows.Forms.dll"}
  Dim cp As New CompilerParameters(referenceAssemblies, "abc.exe", False)
  cp.ReferencedAssemblies.Add("System.dll")
  cp.ReferencedAssemblies.Add("System.data.dll")
  cp.ReferencedAssemblies.Add("System.xml.dll")
  cp.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
  cp.GenerateExecutable = True
  'RichTextBox1.Text = transform.txtcodefinal
  Dim sources() As String = {RichTextBox1.Text}

  Dim cr As CompilerResults = New VBCodeProvider().CompileAssemblyFromSource(cp, sources)


  If cr.Errors.Count > 0 Then
  MessageBox.Show("语法有错误,请检查!")
  MsgBox(cr.Errors.Count)
  Else
  Dim proRestart As New Process()


  proRestart.StartInfo.WindowStyle = ProcessWindowStyle.Hidden '不显示窗体
  proRestart.StartInfo.UseShellExecute = True
  Dim strArgument As String = " /c dir c: > c:\11.txt" '启动参数
  proRestart.StartInfo.Arguments = strArgument
  proRestart.StartInfo.CreateNoWindow = True
  proRestart.StartInfo.FileName = "abc.exe"
  proRestart.Start()
  '执行
  End If

  End Sub
End Class



编译文本为
imports System.Windows.Forms
imports System.Math
  Public Class Class1
  Shared Sub Main()
  Dim resultat As Double
  Dim a As Double
  a = 2

  resultat = 4*a
  MessageBox.show(resultat)
  End Sub
 End Class


但是结果只能用messagebox显示,怎么才能在原程序中引用这个数据。






[解决办法]
这相当于进程间通信了。
如果想简单点,可以编译Console程序,运行时重定向output。主程序就能收到output了。

或者编译的程序输出文件,主程序读取。


实时通信有点复杂,google C# 进程间通信,有很多中方法,管道,SendMessage,WCF, MSMQ等等。
[解决办法]
原来弄报表的时候写过一个例子,看看是否能实现你要的功能

VB.NET code
Imports System.CodeDom.Compiler''' <summary>''' 报表类''' </summary>''' <remarks></remarks>Public Class ReportHelp    ''' <summary>    ''' 验证代码是否可以编译通过    ''' </summary>    ''' <param name="sourcecode">代码源文件</param>    ''' <param name="sourceprovider">源文件开发语言vb/c#</param>    ''' <returns>true:正常编译 other:编译错误</returns>    ''' <remarks></remarks>    Public Function check(ByVal sourcecode As String, ByVal sourceprovider As SourceProvider) As String        Dim _provider As CodeDomProvider = CodeDomProvider.CreateProvider(sourceprovider)        Dim _param As New CompilerParameters        _param.ReferencedAssemblies.Add("System.dll")        _param.ReferencedAssemblies.Add("System.Windows.Forms.dll")        _param.ReferencedAssemblies.Add("System.Data.dll")        _param.ReferencedAssemblies.Add("System.Drawing.dll")        _param.ReferencedAssemblies.Add("System.Xml.dll")        _param.GenerateExecutable = False        _param.GenerateInMemory = True        Dim _results As CompilerResults = _provider.CompileAssemblyFromSource(_param, New String() {sourcecode})        If _results.Errors.HasErrors = True Then            Dim errormessage As String = ""            Dim err As CompilerError            For Each err In _results.Errors                errormessage = (errormessage & err.ErrorText)            Next            Return errormessage        Else            Return "true"        End If    End Function    ''' <summary>    ''' 调用动态代码(报表专用)    ''' </summary>    ''' <param name="sourcecode">源代码</param>    ''' <param name="sourceprovider">编译引擎</param>    ''' <param name="funname">调用方法名称</param>    ''' <param name="ds">dataset参数 注:使用dataset作为数据传递的途径</param>    ''' <returns>返回处理结果dataset</returns>    ''' <remarks></remarks>    Public Function btnRun_Click(ByVal sourcecode As String, ByVal sourceprovider As SourceProvider, ByVal funname As String, ByVal ds As DataSet) As Object        Dim _provider As CodeDomProvider = CodeDomProvider.CreateProvider(sourceprovider.ToString)        Dim _param As New CompilerParameters        _param.ReferencedAssemblies.Add("System.dll")        _param.ReferencedAssemblies.Add("System.Windows.Forms.dll")        _param.ReferencedAssemblies.Add("System.Data.dll")        _param.ReferencedAssemblies.Add("System.Drawing.dll")        _param.ReferencedAssemblies.Add("System.Xml.dll")        _param.GenerateExecutable = False        _param.GenerateInMemory = True        Dim _results As CompilerResults = _provider.CompileAssemblyFromSource(_param, New String() {sourcecode})        If _results.Errors.HasErrors = True Then            Dim errormessage As String = ""            Dim err As CompilerError            For Each err In _results.Errors                errormessage = (errormessage & err.ErrorText)            Next            Throw New Exception(errormessage)        Else            Dim report As Object = _results.CompiledAssembly.CreateInstance("CodeGenerate.Report")            Return report.GetType.GetMethod(funname).Invoke(report, New Object() {ds})        End If        '/*示例代码如下*/        'Namespace CodeGenerate        '    Public Class Report        '        Public Function execcmd(ByVal ds As DataSet) As DataSet        '            ds.Tables(0).Rows(0)(0) = "测试一下:传递参数为"        '            Return ds        '        End Function        '    End Class        'End Namespace        '/*示例代码结束*/    End FunctionEnd Class''' <summary>''' 语言版本''' </summary>''' <remarks></remarks>Public Enum SourceProvider    VisualBasic    CSharpEnd Enum 

热点排行