Question

J'éprouve des difficultés compiler dynamiquement une DLL pour une utilisation avec Silverlight 3.0. Mon objectif est de prendre des règles prévues par mes utilisateurs et les compiler dans une DLL à des fins d'édition personnalisée.

J'ai créé un projet de bibliothèque de classe Silverlight dans Visual Studio pour obtenir la ligne de commande pour compiler une bibliothèque de classes Silverlight. Sur la base de cela et les nombreux exemples pour la compilation VB en utilisant le VBCodeProvider, je suis venu avec la méthode suivante pour le code Comping dans une chaîne à une 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

Ma classe de test unitaire qui code comme suit:

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

Cela ne compile pas avec l'erreur suivante:

vbc: ligne de commande (0,0): Erreur BC2010: compilation a échoué: « Membre 'IsNumeric' ne peut être trouvée dans la classe 'Microsoft.VisualBasic.Information'. Cette condition est généralement le résultat d'un mal apparié « Microsoft.VisualBasic.dll ».

Je l'ai regardé et, en fait, la version Silverlight de la Microsoft.VisualBasic.Information de classe ne contient pas membre IsNumeric. Donc, je semble être ramasser les bonnes bibliothèques en utilisant l'option sdkpath. Mais je ne sais pas pourquoi Je suis en train d'appeler cette méthode en premier lieu.

Quelqu'un peut-il faire la lumière sur la façon de compiler avec succès le code source de manière dynamique dans une bibliothèque de classes compatible Silverlight? TIA.

Était-ce utile?

La solution

trouvé la réponse en obtenant le fournisseur de code pour enregistrer les fichiers temporaires, il a été en train de créer. Ceci est fait mon ajouter:

    parameters.TempFiles.KeepFiles = True

aux options du compilateur.

Quand cela a été fait, la ligne de commande vbc et le code compilé, il a été laissé dans mon répertoire temporaire de l'utilisateur. En regardant, je pouvais voir que j'utilisais le compilateur vbc dans le répertoire .Net 2.0, pas le répertoire 3.5.

Pour obtenir d'utiliser le compilateur dans le répertoire 3.5, les lignes sous la « compilation commentaire ont été modifiés à ce qui suit:

    ' 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)

Il utilise une surcharge sur le constructeur VBCodeProvider qui prend des options de langue. Un collègue a trouvé ce réflecteur à l'aide sur le moteur de modèle T4; plus tard, je l'ai trouvé documenté dans un exemple:

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

Une fois que cela a été correctement défini, le code compilé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top