代码之家  ›  专栏  ›  技术社区  ›  jlo

需要使用VBCodeProvider编译Silverlight 3.0的DLL的帮助吗

  •  1
  • jlo  · 技术社区  · 16 年前

    我很难动态编译用于Silverlight 3.0的DLL。我的目标是采用用户提供的一些规则,并将它们编译成DLL以进行自定义编辑。

    我在VisualStudio中创建了一个Silverlight类库项目,以获取用于编译Silverlight类库的命令行。基于这一点以及使用VBCodeProvider编译VB的许多示例,我提出了以下将字符串中的代码编译为DLL的方法:

    Public Function Compile(ByVal code As String, ByVal assemblyName As String) As CompilerResults
        ' set the compiler parameters
        Dim parameters As CompilerParameters = New CompilerParameters()
        parameters.OutputAssembly = assemblyName
        parameters.GenerateInMemory = False
        parameters.GenerateExecutable = False
        parameters.IncludeDebugInformation = True
    
        ' constants for the silverlight assembly directories
        Dim sdkDir As String = "c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v3.0\"
        Dim clientDir As String = "c:\Program Files (x86)\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\"
        Dim riaDir As String = "C:\Program Files (x86)\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight\"
    
        ' set referenced assemblies
        parameters.ReferencedAssemblies.Clear()
        parameters.ReferencedAssemblies.Add(sdkDir + "mscorlib.dll")
        parameters.ReferencedAssemblies.Add(sdkDir + "System.Core.dll")
        parameters.ReferencedAssemblies.Add(sdkDir + "system.dll")
        parameters.ReferencedAssemblies.Add(sdkDir + "System.Net.dll")
        parameters.ReferencedAssemblies.Add(sdkDir + "System.Windows.Browser.dll")
        parameters.ReferencedAssemblies.Add(sdkDir + "System.Windows.dll")
        parameters.ReferencedAssemblies.Add(sdkDir + "System.Xml.dll")
    
        ' build compiler options for sdk path to point to Silverlight.
        Dim options As String
    
        options = "/sdkpath:""" + sdkDir + "\"" "
        options = options + "/define:""SILVERLIGHT=1"""
    
        parameters.CompilerOptions = options
    
        ' compile
        Dim provider = New VBCodeProvider()
        Return provider.CompileAssemblyFromSource(parameters, code)
    End Function
    

    我的单元测试类的代码如下:

    Public Sub CompileTest()
    
        ' Assemble
        Dim builder As StringBuilder = New StringBuilder()
        builder.AppendLine("Imports System")
        builder.AppendLine("Namespace Namespace1")
        builder.AppendLine("Public Class Class1")
        builder.AppendLine("Public Sub Test()")
        builder.AppendLine("Console.WriteLine(""Hello Compilation"")")
        builder.AppendLine("Console.ReadLine()")
        builder.AppendLine("End Sub")
        builder.AppendLine("End Class")
        builder.AppendLine("End Namespace")
    
        Dim assemblyName As String = ".\TestAssembly.dll"
    
        ' Act
        Dim compiler As SilverlightCompiler = New SilverlightCompiler()
        Dim cr As CompilerResults = compiler.Compile(builder.ToString(), assemblyName)
    
        ' Assert
        Assert.AreEqual(0, cr.Errors.Count)
    End Sub
    

    vbc:命令行(0,0):错误BC2010:编译失败:“在类“Microsoft.VisualBasic.Information”中找不到成员“IsNumeric”。这种情况通常是由不匹配的“Microsoft.VisualBasic.dll”造成的

    为什么? 我首先尝试调用该方法。

    有人能解释如何成功地将源代码动态编译到Silverlight兼容的类库中吗?蒂亚。

    1 回复  |  直到 14 年前
        1
  •  1
  •   jlo    16 年前

        parameters.TempFiles.KeepFiles = True
    

    完成此操作后,vbc命令行及其编译的代码将留在我的用户临时目录中。看着它,我可以看到我在.NET2.0目录中使用vbc编译器,而不是在3.5目录中。

    为了让它使用3.5目录中的编译器,“Compile comment”下的行更改为:

        ' compile
        Dim languageOptions As Dictionary(Of String, String) = New Dictionary(Of String, String)()
        languageOptions("CompilerVersion") = "v3.5"
    
        Dim provider = New VBCodeProvider(languageOptions)
        Return provider.CompileAssemblyFromSource(parameters, code)
    

    它在接受语言选项的VBCodeProvider构造函数上使用重载。一位同事使用T4模板引擎上的反射器发现了这一点;后来我发现它记录在这里的一个示例中:

    http://msdn.microsoft.com/en-us/library/bb470844.aspx

    推荐文章