PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compile VB.NET "onthefly"



Hu5eL
15.08.2009, 11:37
Halli Hallo,
hab jetzt leider ein größeres Problem.
Ich möchte eine art Builder für mein Server schreiben. Hab auch eine Function in VB.Net die eine .exe aus nem string generiert.
leider schaffe ich es aber nicht aus meinem gültigen vb.net code ne exe zu bekommen:


Public Function Compile(ByVal v_Source As String) As System.CodeDom.Compiler.CompilerResults

Dim provider As Microsoft.VisualBasic.VBCodeProvider
Dim compiler As System.CodeDom.Compiler.ICodeCompiler
Dim params As System.CodeDom.Compiler.CompilerParameters
Dim results As System.CodeDom.Compiler.CompilerResults

params = New System.CodeDom.Compiler.CompilerParameters
params.GenerateInMemory = True 'Assembly is created in memory

params.TreatWarningsAsErrors = False
params.WarningLevel = 4
'Put any references you need here - even you own dll's, if you want to use one

Dim refs() As String = {"System.dll", "Microsoft.VisualBasic.dll"}
params.ReferencedAssemblies.AddRange(refs)
params.GenerateExecutable = True

Try
provider = New Microsoft.VisualBasic.VBCodeProvider
compiler = provider.CreateCompiler
results = compiler.CompileAssemblyFromSource(params, v_Source)
Return results
Catch ex As Exception
'Compile errors don't throw exceptions; you've got some deeper problem...

MessageBox.Show(ex.Message)
Return Nothing
End Try
End Function


End Classaber selbst an den "simpelsten" programm scheitere ich:


strb = "Public Class Form1 " & vbNewLine
strb &= "Public Shared Sub Main()" & vbNewLine
strb &= "MessageBox.Show()" & vbNewLine
strb &= "End Sub" & vbNewLine
strb &= "End Class" & vbNewLine

Debug.WriteLine(strb)

Dim cr As System.CodeDom.Compiler.CompilerResults = Compile(strb)--> Der Name MessageBox wurde nicht deklariert.
Muss ich irgendwie ne dll von visual basic.net einbinden?
wie funktioniert das mit labels etc? woher weis der compiler wo die liegen sollen?
bitte um hilfe :-/

KellerKind
15.08.2009, 12:37
Versuch mal msgbox(ex.Message)

hackerking
15.08.2009, 13:30
Dass liegt daran, dass MessageBox im Namespace System.Windows.Forms (oder so) ist, und diese Datei wird nicht importiert, wenn du so kompilierst.

krusty
16.08.2009, 22:16
versuchs mal mit msgbox()

alexj
04.09.2009, 15:27
Dim refs() As String = {"System.dll", "Microsoft.VisualBasic.dll"}


zu >



Dim refs() As String = {"System.dll", "Microsoft.VisualBasic.dll", "System.Windows.Forms.dll"}



params.GenerateInMemory = True


Wieso solltest du es in Memory laden? Brauchst du nicht kannst du auch auf False setzen.

Hu5eL
04.09.2009, 15:44
Dim refs() As String = {"System.dll", "Microsoft.VisualBasic.dll"}
zu >



Dim refs() As String = {"System.dll", "Microsoft.VisualBasic.dll", "System.Windows.Forms.dll"}


params.GenerateInMemory = True
Wieso solltest du es in Memory laden? Brauchst du nicht kannst du auch auf False setzen.
danke.
woher weis ich jetzt welch dll´s Visual-Studio von haus aus immer mit "importiert"?

sind das nur die 3?

alexj
04.09.2009, 16:35
My Project > References

Die du da siehst sind vom Anfang an dabei obwohl man nicht alle braucht z.b. Wenn du nicht mit XML arbeitest brauchst du kein System.Xml.dll

Sirect
04.09.2009, 17:13
Public Class Form1
Private Sub Button1_Click() Handles Button1.Click
Dim code As String = TextBox2.Text.Replace("REPLACE", TextBox1.Text)
If My.Computer.FileSystem.DirectoryExists("C:\Builts") = False Then
My.Computer.FileSystem.CreateDirectory("C:\Builts")
End If
My.Computer.FileSystem.WriteAllText("C:\Builts\test.vb", code, False)
Shell("C:\WINDOWS\Microsoft.NET\Framework\v3.5\vbc.exe /t:exe F:\Builts\test.vb", AppWinStyle.Hide, True)
End Sub
End Class


In Textbox2 würde das stehen:



Module Test

Sub Main()
MsgBox("REPLACE")
End Sub

End Module


Und in Textbox1 trägst du den Text ein der nachher erscheinen soll :)
Viel Spaß!
Pfade musst du anpassen!

hackerking
04.09.2009, 17:51
Die Methode ist unsauber...
Der CodeProvider ist da schon viel besser.

Sirect
04.09.2009, 18:07
Der Code ist um längen kürzer und besser zu verstehen. Klar, du solltest hier mit Umgebungsvariablen arbeiten, und auch keine Replace-Funktion nutzen. Ansonsten sehe ich keinen Ansatz warum der Code schlecht sein soll.

hackerking
04.09.2009, 18:12
Weil man beim CodeProvider erstens exakt angeben kann, was man will, zweitens kein extra Prozess gestartet werden muss und drittens kann es ja sein, dass i-ein Volltrottel die vbc exe gelöscht hat :D

Außerdem finde ich es nicht schlimm das der Code ein bisschen länger ist..

Sirect
04.09.2009, 18:24
Naja davon gehe ich mal nicht aus. Kann ja auch sein dass einer Wahlos DLL's gelöscht hat, dann geht keine Methode auch nich mehr :D

alexj
04.09.2009, 18:53
Der Code ist um längen kürzer und besser zu verstehen. Klar, du solltest hier mit Umgebungsvariablen arbeiten, und auch keine Replace-Funktion nutzen. Ansonsten sehe ich keinen Ansatz warum der Code schlecht sein soll.

Vielleicht kürzer aber diese Methode zu benutzen ist nicht der Sinn von .Net sonst hätten sie ja kein CodeDom eingebaut ;)

Sirect
04.09.2009, 19:42
Warum liefert das Framework dann den Command-Line-Compiler mit? :D