Avatar billede MadsHaupt Juniormester
08. november 2013 - 20:37 Der er 9 kommentarer og
1 løsning

add references to system.reflection.emit.assemblybuilder

Hvordan kan jeg tilføje assembly references til en assemblybuilder, for ellers kan jeg ikke emit'te et program der kan nået som helst.

Kode:
Dim ass As AssemblyBuilder = Thread.GetDomain.DefineDynamicAssembly(New AssemblyName("Assembly"), AssemblyBuilderAccess.RunAndSave, Environment.GetFolderPath(Environment.SpecialFolder.Desktop))
        ass.DefineVersionInfoResource("", "", "", "", "")
        Dim [mod] As ModuleBuilder = ass.DefineDynamicModule("Assembly", "Assembly.exe", True)
        Dim typ As TypeBuilder = [mod].DefineType("Assembly.Type1", TypeAttributes.Public Or TypeAttributes.Class)
        Dim met As MethodBuilder = typ.DefineMethod("Invoke", MethodAttributes.Public, GetType(Void), {}) 'GetType(String).MakeByRefType, GetType(String)})
        'met.DefineParameter(1, ParameterAttributes.None, "str")
        'met.DefineParameter(2, ParameterAttributes.None, "newstr")
        Dim il As ILGenerator = met.GetILGenerator
        il.Emit(OpCodes.Ret)
        typ.CreateType()
        [mod].CreateGlobalFunctions()
        ass.SetEntryPoint(met, PEFileKinds.WindowApplication)
        ass.Save("Assembly.exe")
Avatar billede arne_v Ekspert
09. november 2013 - 01:13 #1
Maa man spoerge om hvorfor du ikke bruger compiler service?
Avatar billede MadsHaupt Juniormester
05. februar 2014 - 16:06 #2
Hvad er compiler service?.
Avatar billede arne_v Ekspert
05. februar 2014 - 17:06 #3
Den goer at du kan lave en string med VB.NET kode og compile den, loade den og kalde koden.

Langt nemmere at debugge efter min mening.
Avatar billede MadsHaupt Juniormester
05. februar 2014 - 17:17 #4
Hvordan bruger man compiler service?.
Avatar billede arne_v Ekspert
05. februar 2014 - 17:27 #5
Jeg kan lave et lille eksempel. Senere idag.
Avatar billede MadsHaupt Juniormester
05. februar 2014 - 17:34 #6
OK.
Avatar billede arne_v Ekspert
05. februar 2014 - 21:18 #7

Imports System
Imports System.CodeDom.Compiler
Imports System.Collections.Generic
Imports System.Reflection

Imports Microsoft.VisualBasic

Namespace E
    Public Interface IDemo
        Sub DoIt()
    End Interface
    Public Class Program
        Public Shared Sub Exec(src As String, typnam As String)
            Dim comp As CodeDomProvider = New VBCodeProvider()
            Dim param As New CompilerParameters()
            param.GenerateInMemory = True
            param.ReferencedAssemblies.Add("System.dll")
            param.ReferencedAssemblies.Add("System.Core.dll")
            param.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location)
            Dim res As CompilerResults = comp.CompileAssemblyFromSource(param, src)
            If res.Errors.Count > 0 Then
                Console.WriteLine(src)
                For Each ce As CompilerError In res.Errors
                    Console.WriteLine(ce)
                Next
            End If
            Dim asm As Assembly = res.CompiledAssembly
            Dim o As IDemo = DirectCast(asm.CreateInstance(typnam), IDemo)
            o.DoIt()
        End Sub
        Public Shared Sub Main(args As String())
            Dim c1 As String = "Imports System" & vbCrLf & _
                              vbCrLf & _
                              "Imports E" & vbCrLf & _
                              vbCrLf & _
                              "Namespace Demo" & vbCrLf & _
                              "    Public Class C1" & vbCrLf & _
                              "    Implements IDemo" & vbCrLf & _
                              "        Public Sub DoIt() Implements IDemo.DoIt" & VbCrLf & _
                              "            Console.WriteLine(""Hello from C1"")" & VbCrLf & _
                              "        End Sub" & VbCrLf & _
                              "    End Class" & VbCrLf & _
                              "End Namespace" & VbCrLf
            Dim c2 As String = "Imports System" & vbCrLf & _
                              vbCrLf & _
                              "Imports E" & vbCrLf & _
                              vbCrLf & _
                              "Namespace Demo" & vbCrLf & _
                              "    Public Class C2" & vbCrLf & _
                              "    Implements IDemo" & vbCrLf & _
                              "        Public Sub DoIt() Implements IDemo.DoIt" & VbCrLf & _
                              "            Console.WriteLine(""Hello from C2"")" & VbCrLf & _
                              "        End Sub" & VbCrLf & _
                              "    End Class" & VbCrLf & _
                              "End Namespace" & VbCrLf
            Exec(c1, "Demo.C1")
            Exec(c2, "Demo.C2")
            Console.ReadKey()
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
05. februar 2014 - 21:18 #8
Det er naturligvis kun sjovt hvis src string faktisk opbygges dynamisk.
Avatar billede MadsHaupt Juniormester
12. marts 2014 - 15:53 #9
arne_v jeg tror at jeg bruger compiler service til det, jeg tror også bare at grunden til at jeg prøvede det, var at jeg er i gang med at lave en VB decompiler, så tester jeg jo, og så synes jeg det kunne være sjovt hvis jeg også kunne finde ud af at lave en compiler fra bunden af, arne_v skriv et svar så får du point.
Avatar billede arne_v Ekspert
12. marts 2014 - 16:00 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester