Générer une class VB.Net

cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 1 avril 2009 à 17:44
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 4 avril 2009 à 09:07
Bonjours,


J'ai créée un concepteur de form en VB.Net 2008 (DesignSurface, IDesignerHost...etc).

Il fonction plutôt bien.

J'aimerais pouvoir enregistrer le contenu du designer dans une class VB.Net.


J'ai trouvé l'astuce, avec CodeDom, CodeCompileUnit...Etc


Mais il y a un énorme HICK, lol


A la fin, j'obtiens une class vb.Net sans bug, jusque que je ne sais
pas comment faire pour, comment dire, obtenir le contenu du design...


En gros, je me retrouve avec la sub InitializeComponent vide !!! lol,
je ne sais pas ce que je dois faire pour qu'elle possède des truc du
genre Me.Button1.Text = "Du Texte" ....etc


Voici mon code :

Dim myDesignerClass As CodeDom.CodeTypeDeclaration
        Dim initializeComponent As CodeDom.CodeMemberMethod
        Dim main As CodeDom.CodeEntryPointMethod
        Dim con As CodeDom.CodeConstructor
        Dim ns As CodeDom.CodeNamespace
        Dim root As System.ComponentModel.IComponent
        Dim nametable As Hashtable
        Dim ds As System.ComponentModel.Design.DesignSurface
        Dim idh As System.ComponentModel.Design.IDesignerHost

        Code = New CodeDom.CodeCompileUnit
        ds = Me.Designer ' Le DesignSurface
        ds.Flush()
        idh = DirectCast(ds.GetService(GetType(System.ComponentModel.Design.IDesignerHost)), System.ComponentModel.Design.IDesignerHost)
        root = idh.RootComponent

        nametable = New Hashtable(idh.Container.Components.Count)

        ns = New CodeDom.CodeNamespace(Projet_Variable.Nom)

        myDesignerClass = New CodeDom.CodeTypeDeclaration
        initializeComponent = New CodeDom.CodeMemberMethod

        ' Imports
        ns.Imports.Add(New CodeDom.CodeNamespaceImport("System"))
        ns.Imports.Add(New CodeDom.CodeNamespaceImport("System.ComponentModel"))
        ns.Imports.Add(New CodeDom.CodeNamespaceImport("System.Windows.Forms"))

        myDesignerClass = New CodeDom.CodeTypeDeclaration(root.Site.Name)
        myDesignerClass.BaseTypes.Add(root.GetType.FullName)
        ns.Types.Add(myDesignerClass)

        code.Namespaces.Add(ns)

        ' Constructeurs
        con = New CodeDom.CodeConstructor
        con.Attributes = CodeDom.MemberAttributes.Public
        con.Statements.Add(New CodeDom.CodeMethodInvokeExpression(New CodeDom.CodeMethodReferenceExpression(New CodeDom.CodeThisReferenceExpression(), "InitializeComponent")))
        myDesignerClass.Members.Add(con)

        ' Main
        main = New CodeDom.CodeEntryPointMethod
        main.Name = "Main"
        main.Attributes = CodeDom.MemberAttributes.Public Or CodeDom.MemberAttributes.Static
        main.CustomAttributes.Add(New CodeDom.CodeAttributeDeclaration("System.STAThreadAttribute"))
        main.Statements.Add(New CodeDom.CodeMethodInvokeExpression(New CodeDom.CodeMethodReferenceExpression(New CodeDom.CodeTypeReferenceExpression(GetType(System.Windows.Forms.Application)), "Run"), New CodeDom.CodeExpression() {New CodeDom.CodeObjectCreateExpression(New CodeDom.CodeTypeReference(root.Site.Name))}))
        myDesignerClass.Members.Add(main)

        ' InitializeComponent
        initializeComponent = New CodeDom.CodeMemberMethod
        initializeComponent.Name = "InitializeComponent"
        initializeComponent.Attributes = CodeDom.MemberAttributes.Private
        initializeComponent.ReturnType = New CodeDom.CodeTypeReference(GetType(Void))
        myDesignerClass.Members.Add(initializeComponent)

        Dim names As Reflection.AssemblyName() = Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()
        Dim i As Integer = 0
        While i < names.Length
            Dim assembly As Reflection.Assembly = Reflection.Assembly.Load(names(i))
            code.ReferencedAssemblies.Add(assembly.Location)
            i += 1
        End While

        Dim o As CodeDom.Compiler.CodeGeneratorOptions = New CodeDom.Compiler.CodeGeneratorOptions

        o.BlankLinesBetweenMembers = True
        o.BracingStyle = "VB"
        o.ElseOnClosing = False
        o.IndentString = "    "

        Dim swVB As IO.StringWriter = New IO.StringWriter
        Dim vb As VBCodeProvider = New VBCodeProvider

        vb.GenerateCodeFromCompileUnit(code, swVB, o)

        MsgBox(swVB.ToString)

Pas très commenté, désolé.


Pouvez-vous m'aider?


Merci d'avance

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***

1 réponse

cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
4 avril 2009 à 09:07
Personne n'a une idée?

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
Rejoignez-nous