Il programma che sto scrivendo utilizza la classe VBCodeProvider per compilare del codice prodotto a runtime e generare degli eseguibili. Ho due perplessità:
1) Dato che gli eseguibili in questione sono delle windows forms applications, ci sono dei controlli visuali sul form. Il form principale viene avviato con ShowDialog() (con Show() spariva subito...) da un modulo, nella Sub Main. Funziona tutto alla perfezione, se non fosse che tutti i controlli hanno lo stile di windows 98, sebbene siano esplicitamente dichiarati con FlatStyle = System, il che li dovrebbe far disegnare come comuni pulsanti di Vista (nel mio caso).
2) E' possibile includere un file grezzo nell'eseguibile? Non intendo farlo attraverso le risorse, poiché dovrei scrivere e compilare anche un file *.resx, e quindi vederne anche la documentazione. La soluzione provvisoria che ho adottato ora è memorizzarlo come un testo in base64 in una stringa, che viene poi decodificata quando il programma viene eseguito. La pecca è che il testo così formattato utilizza molto (e dico molto) spazio in più.
Il codice di compilazione è questo:
codice:
Dim Parameters As New CodeDom.Compiler.CompilerParameters
With Parameters
.GenerateExecutable = True
.TreatWarningsAsErrors = True
.TempFiles.KeepFiles = False
.GenerateInMemory = False
.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
.ReferencedAssemblies.Add("System.dll")
.ReferencedAssemblies.Add("System.Drawing.dll")
.ReferencedAssemblies.Add("System.Windows.Forms.dll")
.OutputAssembly = SetupPath
.MainClass = "StartSetup"
.CompilerOptions = "/target:winexe"
End With
Dim Provider As New VBCodeProvider
Dim CompResults As CompilerResults = Provider.CompileAssemblyFromSource(Parameters, Code.ToString)
If CompResults.Errors.Count > 0 Then
Dim Msg As String = ""
For Each Err As CompilerError In CompResults.Errors
Msg &= Err.ToString & vbCrLf
Next
Stop
Else
Stop
End If