Δοκίμασε το παρακάτω ίσως νά σου κάνει.
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.IO
Imports Microsoft.CSharp
Imports Microsoft.VisualBasic
'Imports Microsoft.JScript
Module EntryPoint
#Region "Enums"
Friend Enum ParserType
CSharpCode = 15
VBasicCode = 16
JSharpCode = 17
End Enum
#End Region
Private CodeType As ParserType = ParserType.VBasicCode
Private CodeProvider As System.CodeDom.Compiler.CodeDomProvider = New VBCodeProvider
Sub Main()
' Create the Unit
Dim Unit As CodeCompileUnit = New CodeCompileUnit
' Define a namespace and add Imports statements
Dim Namespaces As CodeNamespace = New CodeNamespace("Test.CreateForm")
Namespaces.Imports.Add(New CodeNamespaceImport("System"))
Namespaces.Imports.Add(New CodeNamespaceImport("System.Drawing"))
Namespaces.Imports.Add(New CodeNamespaceImport("System.Windows.Forms"))
Namespaces.Imports.Add(New CodeNamespaceImport("System.Xml"))
Namespaces.Imports.Add(New CodeNamespaceImport("System.Data"))
Unit.Namespaces.Add(Namespaces)
' Declare the type including base type
Dim MyType As CodeTypeDeclaration = New CodeTypeDeclaration("Form1")
MyType.IsClass = True
MyType.TypeAttributes = Reflection.TypeAttributes.Public
MyType.BaseTypes.Add("System.Windows.Forms.Form")
Namespaces.Types.Add(MyType)
' Create the constructor/Sub New and add code
Dim Constructor As CodeConstructor = New CodeConstructor
Constructor.Attributes = MemberAttributes.Public
Constructor.Statements.Add(New CodeMethodInvokeExpression(New CodeThisReferenceExpression, "InitializeComponent", New CodeBLOCKED EXPRESSION {}))
MyType.Members.Add(Constructor)
' Declare component container
MyType.Members.Add(New CodeMemberField("System.ComponentModel. IContainer", "components"))
' Implement the Dispose method
Dim DisposeMethod As CodeMemberMethod = New CodeMemberMethod
DisposeMethod.Name = "Dispose"
DisposeMethod.Attributes = MemberAttributes.Family Or MemberAttributes.Overloaded Or MemberAttributes.Override
DisposeMethod.Parameters.Add(New CodeParameterDeclarationExpression(GetType(Boolean), "disposing"))
Dim Statement As CodeConditionStatement = New CodeConditionStatement
Statement.Condition = New CodeArgumentReferenceExpression("disposing")
Dim TrueStatement As CodeConditionStatement = New CodeConditionStatement
TrueStatement.Condition = New CodeBinaryOperatorExpression(New CodeArgumentReferenceExpression("components"), CodeBinaryOperatorType.IdentityInequality, New CodePrimitiveExpression(Nothing))
TrueStatement.TrueStatements.Add(New CodeMethodInvokeExpression(New CodeFieldReferenceExpression(Nothing, "components"), "Dispose", New CodeBLOCKED EXPRESSION {}))
Statement.TrueStatements.Add(TrueStatement)
DisposeMethod.Statements.Add(Statement)
DisposeMethod.Statements.Add(New CodeMethodInvokeExpression(New CodeBaseReferenceExpression, "Dispose", New CodeArgumentReferenceBLOCKED EXPRESSION {New CodeArgumentReferenceExpression("disposing")}))
MyType.Members.Add(DisposeMethod)
' InitializeComponent
Dim InitializeMethod As CodeMemberMethod = New CodeMemberMethod
InitializeMethod.Name = "InitializeComponent"
InitializeMethod.Attributes = MemberAttributes.Private
InitializeMethod.CustomAttributes.Add(New CodeAttributeDeclaration("System.Diagnostics.DebuggerStepThrough"))
InitializeMethod.Statements.Add(New CodeAssignStatement(New CodeFieldReferenceExpression(New CodeThisReferenceExpression, "components"), New CodeObjectCreateExpression(New CodeTypeReference(GetType(System.ComponentModel.Container)), New CodeBLOCKED EXPRESSION {})))
MyType.Members.Add(InitializeMethod)
' Main entry point
Dim MainMethod As CodeEntryPointMethod = New CodeEntryPointMethod
MainMethod.Name = "Main"
MyType.Members.Add(MainMethod)
' Add mouse move event
Dim eventstate As New CodeMemberEvent
eventstate.Name = "MouseMove"
eventstate.Attributes = MemberAttributes.Final Or MemberAttributes.Public
eventstate.Type = New CodeTypeReference("System.Windows.Forms.MouseEventHandler")
MyType.Members.Add(eventstate)
Dim OutputName As String = "Form1" + GetFileExtension()
' Write the source code
Dim sw As StreamWriter = New StreamWriter(OutputName)
sw.AutoFlush = True
Try
Dim Generator As ICodeGenerator = (CodeProvider).CreateGenerator
Generator.GenerateCodeFromCompileUnit(Unit, sw, Nothing)
Finally
sw.Close()
End Try
' Create the compiler
Dim Compiler As ICodeCompiler = (CodeProvider).CreateCompiler()
' Create the compiler options
' Include referenced assemblies
Dim Options As CompilerParameters = New CompilerParameters
Options.GenerateExecutable = True
Options.OutputAssembly = "TestForm1.exe"
Options.CompilerOptions = "/target:winexe"
Options.MainClass = "Test.CreateForm.Form1"
Options.ReferencedAssemblies.AddRange(New String() {"System.dll", "System.Data.dll", "System.Drawing.dll", "System.Windows.Forms.dll", "System.XML.dll"})
' Build and look for compiler errors
Dim Result As CompilerResults = _
Compiler.CompileAssemblyFromFile(Options, OutputName)
Dim E As CompilerError
If (Result.Errors.Count > 0) Then
For Each E In Result.Errors
Console.WriteLine(E.ErrorText)
Next
Else
Console.WriteLine("compiled successfully")
End If
Console.WriteLine("press enter to continue")
Console.ReadLine()
End Sub
#Region "GetFileExtension"
Private Function GetFileExtension() As String
Try
Select Case CodeType
Case ParserType.CSharpCode
Return ".cs"
Case ParserType.JSharpCode
Return ".jsl"
Case ParserType.VBasicCode
Return ".vb"
End Select
Catch ex As Exception
End Try
End Function
#End Region
End Module
Το είχα βρεί κάπου στο INTERNET αλλά δέν θυμάμαι πού.
Βέβαια θα χρειαστεί λίγο τροποποίηση.
Ιωάννης Μανουσάκης