Men så vidt jeg lige kan gennemskue, bruger den bl.a et par .dll, og jeg skal jo være sikker på, at det virker alle steder (jeg ved godt at koden bliver kompileret på serveren, men det skal helst virke, uden at jeg skal installere noget på serveren).
Kan koden køres fra en .aspx side, eller er det mere en .exe, beskrivelsen henviser til?
Det er et almindeligt website, hvorfra jeg gerne vil hente en sub i en database, og eksekvere den.
Beklager hvis dine links forklarer det, men jeg synes ikke jeg kan gennemskue det, så jeg håber du kan hjælpe mig lidt videre :-)
Dim src As String = "Public Class X" & Environment.NewLine & " Public Overloads Overrides Function ToString() As String" & Environment.NewLine & " return ""I am a X""" & Environment.NewLine & " End Function" & Environment.NewLine & "End Class" Dim comp As ICodeCompiler = (New VBCodeProvider).CreateCompiler Dim param As CompilerParameters = New CompilerParameters param.GenerateInMemory = True param.ReferencedAssemblies.Add("System.dll") Dim res As CompilerResults = comp.CompileAssemblyFromSource(param, src) Dim asm As System.Reflection.Assembly = res.CompiledAssembly Dim o As Object = asm.CreateInstance("X") Console.WriteLine(o)
Dim provider As Microsoft.VisualBasic.VBCodeProvider Dim compiler As System.CodeDom.Compiler.ICodeCompiler
provider = New Microsoft.VisualBasic.VBCodeProvider
Dim strCode As String strCode = "lbltest.text=xxx" 'Dim src As String = "Public Class X" & Environment.NewLine & " Public Overloads Overrides Function ToString() As String" & Environment.NewLine & " return ""I am a X""" & Environment.NewLine & " End Function" & Environment.NewLine & "End Class" Dim src As String = "Public Class X" & Environment.NewLine & " Public Function doMyGrid()" & Environment.NewLine & strCode & Environment.NewLine & " return ""I am a X""" & Environment.NewLine & " End Function" & Environment.NewLine & "End Class" Dim comp As CodeDom.Compiler.ICodeCompiler = provider.CreateCompiler Dim param As CodeDom.Compiler.CompilerParameters = New CodeDom.Compiler.CompilerParameters param.GenerateInMemory = True param.ReferencedAssemblies.Add("System.dll") Dim res As CodeDom.Compiler.CompilerResults = comp.CompileAssemblyFromSource(param, src) Dim asm As System.Reflection.Assembly = res.CompiledAssembly Dim o As Object = asm.CreateInstance("X") VBmsg(o.domygrid)
Men så fejler på, at den ikke kan finde en dll-fil. Navnet på dll'en er fra mit temp-dir og altid nye navne, så jeg gætter på, det er en den opretter runtime. Hvis jeg fjernes strCode, virker det fint.
Hvordan kan jeg få den til at køre andet end at returnere et tekst?
Jeg skal i princippet ikke have den til at returnere noget, så det må også gerne være en sub. Men det gav samme fejl, da jeg ændrede koden til det.
Så kan jeg vel ikke opnå det jeg gerne vil, eller hvad?
Lad mig lige forklare det hele..... Jeg har en side med et gridview, der automatisk genererer kolonner. Jeg lægger så sql-sætninger i en db, henter den ønskede sql og databinder mit gridview på den. Så langt så godt.
Det jeg også gerne vil, er at have mulighed for at lave yderligere behandling af mit gridview, efter der er lagt data i det. Det kunne f.eks. være formattering af bestemte kolonner, eller summering af et talfelt.
Kan jeg opnå det, men en kode som jeg henter fra databasen?
Imports System Imports System.CodeDom.Compiler Imports Microsoft.VisualBasic
Namespace E Public Interface IDoer Sub DoIt(app As MainClass) End Interface Public Class MainClass Public Sub ItWorks Console.WriteLine("Det virker") End Sub Public Sub RealMain() Dim src As String = "Imports E" & Environment.NewLine & _ "Public Class X" & Environment.NewLine & _ " Implements IDoer" & Environment.NewLine & _ " Public Sub DoIt(app As MainClass) Implements IDoer.DoIt" & Environment.NewLine & _ " app.ItWorks" & Environment.NewLine & _ " End Sub" & Environment.NewLine & _ "End Class" Dim comp As ICodeCompiler = (New VBCodeProvider).CreateCompiler Dim param As CompilerParameters = New CompilerParameters param.GenerateInMemory = True param.ReferencedAssemblies.Add("System.dll") param.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location) Dim res As CompilerResults = comp.CompileAssemblyFromSource(param, src) Dim comperr As CompilerError For Each comperr In res.Errors Console.WriteLine(comperr) Next Dim asm As System.Reflection.Assembly = res.CompiledAssembly Dim o As IDoer = CType(asm.CreateInstance("X"), IDoer) o.DoIt(me) End Sub Public Shared Sub Main(ByVal args As String()) Dim main As MainClass = New MainClass main.RealMain End Sub End Class End Namespace
jeg har forsøgt at få det til at virke, men kan ikke få det integreret med min nuværende kode.
Jeg har lavet en ny class fil (mainclass.vb) og placeret din kode i den. Jeg tilføjer så <add namespace="mainclass"/> i web.config, men jeg kan ikke kalde noget fra din kode.
Skal jeg kalde main eller realmain?
Jeg har også prøvet det samme, men lavet en E.vb og tilføjet <add namespace="E"/> i stedet, men det kan jeg stadig ikke kalde.
Namespace E Public Interface IDoer Sub DoIt(app As DynCompiler) End Interface Public Class DynCompiler Inherits Page Protected dynstuff As Label Public Sub SetDynstuff(s As String) dynstuff.Text = s End Sub Public Sub Page_Load(Sender As Object, E As EventArgs) Dim src As String = "Imports E" & Environment.NewLine & _ "Public Class X" & Environment.NewLine & _ " Implements IDoer" & Environment.NewLine & _ " Public Sub DoIt(app As DynCompiler) Implements IDoer.DoIt" & Environment.NewLine & _ " app.SetDynstuff(""Det virker"")" & Environment.NewLine & _ " End Sub" & Environment.NewLine & _ "End Class" Dim comp As ICodeCompiler = (New VBCodeProvider).CreateCompiler Dim param As CompilerParameters = New CompilerParameters param.GenerateInMemory = True param.ReferencedAssemblies.Add("System.dll") param.ReferencedAssemblies.Add("System.Web.dll") param.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location) Dim res As CompilerResults = comp.CompileAssemblyFromSource(param, src) Dim asm As System.Reflection.Assembly = res.CompiledAssembly Dim o As IDoer = CType(asm.CreateInstance("X"), IDoer) o.DoIt(me) End Sub End Class End Namespace
Tak for det, nu er jeg kommet lidt videre. Jeg kan sagtens får dit eksempel til at virke, men jeg er i tvivl, om jeg kan opnå det jeg gerne vil?!
Jeg er med på, at koden køres via Public Sub SetDynstuff(s As String) dynstuff.Text = s End Sub og at den kaldes med app.SetDynstuff(""Det virker"")
Men jeg vil jo gerne kunne gøre andet, end at sætte teksten på en label, eller sådan noget i den stil.
Jeg vil f.eks. gerne genngmgå et eksisterende gridview og f.eks. formattere et bestemt kolonne eller lægge tallene fra en kolonne sammen. Koden til det, er dynamisk så hvordan kan jeg få den til at eksekvere det?
Jeg kan jo ikke blot kalde SetDynstuff med hele koden.
Det er vel ikke helt fleksibelt nok, at bruge den dynamiske klasse, da jeg gerne vil have hele den dynamiske kode i en database, og der kan være utallige forskellige ting, jeg ønsker at køre.
Jeg kan ikke lige gennemskue, hvordan jeg kan bruge x.DoIt til det? Hvordan kan jeg kalde den med en hel række koder?
Ok. Det er ikke så smidigt som jeg gerne ville have det. Nu skal jeg jo lave en ny sub, for hver eneste ting jeg kan forestille mig der skal laves på mit gridview.
Jeg havde håbet på, at jeg kunne lave min aspx side, og så komme HELE indholdet af en sub i databasen. Alt efter hvilken post i databasen der blev kaldt, kunne jeg så hente og eksekvere den tilhørende sub.
Det ville så være underordnet om den skulle sætte bordercolor, formatere et felt eller noget helt 3.
Det er vel det samme igen - at jeg fra DoIt kalder en anden sub, og ikke foretager ændringen af "bordercolor" DIREKTE i DoIT - men via SetGridBorderColor...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.