如何在vb.net中将字符串转换为代码以及查看主项目的静态或公共变量[重复]

问题描述 投票:0回答:1

可能重复:
如何将当前程序集暴露给CodeProvider

我编写了一段代码,将 vb.net 中的文本框转换为字符串,如下例所示:如何将字符串转换为 c# 中的代码

但是在这个类中我无法从主项目中调用任何静态变量和方法。 这是代码 vb.net:

Dim vb As New VBCodeProvider()
Dim icc As ICodeCompiler = vb.CreateCompiler()
cp = New CompilerParameters
cp.ReferencedAssemblies.Add("System.dll")
cp.ReferencedAssemblies.Add("System.Windows.Forms.dll")
cp.ReferencedAssemblies.Add("System.Xml.dll")
cp.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
cp.ReferencedAssemblies.Add("Comatic(de-ch).exe")
cp.ReferencedAssemblies.Add("System.Data.dll")
cp.ReferencedAssemblies.Add("mscorlib.dll")
cp.CompilerOptions = "/t:library"
cp.GenerateInMemory = True
Dim sb As New StringBuilder("")

sb.Append("Imports System" & vbNewLine)
sb.Append("Imports Microsoft.VisualBasic" & vbNewLine)
sb.Append("Imports System.Windows.Forms" & vbNewLine)
sb.Append("Imports System.Xml" & vbNewLine)
sb.Append("Imports Comatic" & vbNewLine)
sb.Append("Imports System.Data" & vbNewLine)
sb.Append("<System.ComponentModel.ToolboxItem(False)> _" & vbNewLine)

sb.Append("Public Class VbCodeEvaler" & vbNewLine)
sb.Append("Public Sub EvalCode()" & vbNewLine)
sb.Append(TxVbCode.Text & vbNewLine)
sb.Append("End Sub" & vbNewLine)
sb.Append("Dim t As New System.Threading.Thread(AddressOf Me.EvalCode)" & vbNewLine) 'System.Threading.
sb.Append("Public Sub StartThred()" & vbNewLine)
sb.Append("t.Start()" & vbNewLine)
sb.Append("End Sub" & vbNewLine)
sb.Append("Public Sub StopThred()" & vbNewLine)
sb.Append("t.Abort()" & vbNewLine)
sb.Append("End Sub" & vbNewLine)
sb.Append("End Class" & vbNewLine)

cr = icc.CompileAssemblyFromSource(cp, sb.ToString())
If cr.Errors.Count > 0 Then
  MsgBox("Error: " & cr.Errors(0).ErrorText)
  Return Null
End If

Dim a As System.Reflection.Assembly = cr.CompiledAssembly
Dim o As Object = a.CreateInstance("VbCodeEvaler")
Dim t As Type = o.GetType()
'Dim mi As MethodInfo = t.GetMethod("EvalCode")
Dim mi As MethodInfo = t.GetMethod("StartThred")
mi.Invoke(o, Null)

如何从主项目中调用所有静态和公共方法和变量? 谢谢!

.net vb.net reflection vbcodeprovider
1个回答
-1
投票

如果您在模块中调用静态方法,则需要将该模块显式定义为公共。变化:

Module Module1

Public Module Module1

您应该已经能够访问类的任何共享成员了

© www.soinside.com 2019 - 2024. All rights reserved.