[VB.Net] Dynamic Compile en Callback

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
Hoi,

ik heb een stuk code geschreven waarmee ik een extern bestand (VB) kan compileren en vervolgens hier methoden uit aan kan roepen. Dit heb ik volledig voor elkaar gekregen.

Maar....
Ik wil vanuit dit dynamisch gecompileerde stuk code een methode aanroepen in het hoofdprogramma, en dit krijg ik niet voor elkaar....

Het stuk code in de executable is als volgt:

Visual Basic .NET:
1
2
3
4
5
6
7
Public Module modStockRound
    Public Sub NewAuction()



    End Sub
End Module


De code uit de vb.file
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
Imports Microsoft.VisualBasic

Public Class StockRound

    Public Sub StartStockRound(ByVal Phase As String)

                modStockRound.NewAuction()

    End Sub

End Class


Is er iemand die mij op weg kan helpen ??

Groeten,

Kalin

Edit Oplossing gevonden:

Iedereen bedankt voor de tips.

De oplossing die ik gevonden heb is door de volgende regels toe te voegen aan het te compileren bestand.....
Als eerste Initialize aanroepen en vervolgens is NewAuction aan te roepen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    Private MainAssembly As System.Reflection.Assembly

    Public Sub Initialize()

        MainAssembly = [Assembly].GetCallingAssembly

    End Sub

    Public Function CallMain(ByVal MethodName As String, ByVal ParamArray Args() As Object) As Object

        Dim MainType As Type
        Dim MainMethod As MethodInfo
        Dim MethodObject As Object

        MainType = MainAssembly.GetType("Proj18xx2009.clsStockActions")
        MainMethod = MainType.GetMethod(MethodName)
        MethodObject = Activator.CreateInstance(MainType)
        Return MainMethod.Invoke(MethodObject, Args)

    End Function


    Public Sub NewAuction()

        CallMain("NewAuction")

    End Sub

[ Voor 36% gewijzigd door Kalin848 op 22-04-2009 10:10 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21-09 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Volgens mij ben je op zoek naar Reflection en activator.createinstance

[ Voor 7% gewijzigd door gorgi_19 op 10-04-2009 16:40 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
Gorgi,

ik maak inderdaad al gebruik van reflection.
Kun jij mij op weg helpen met hoe ik vanuit de code in de VB-file een methode in de hoofd executable aan kan roepen.

Groeten,

Kalin

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik doe even de aanname dat je op basis van CodeCom de code dynamic hebt gecompileerd.
De CompilerResults class bevat een property CompiledAssembly.

Je kunt je type aanmaken door compilerResults.CompiledAssembly.CreateInstance() aan te roepen.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je een instance van een class hebt ( D.M.V. Activator.CreateInstance ) dan kun je toch gewoon een methode op die class aanroepen ( Als hij een interface implementeerd die je compile-time al weet ).

Als je compile-time nog niet weet welke interface hij implementeerd kun je d.m.v. reflection opvragen welke methodes hij heeft en die dynamisch aanroepen.

http://msdn.microsoft.com...stem.type.getmethods.aspx
en
http://msdn.microsoft.com...em.type.invokemember.aspx

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
De code in de runtime gecompileerde assembly aanroepen lukt mij wel.....
Maar nu wil ik vanuit deze code een methode in de aanroepende assembly gebruiken.

Ik start dus mijn executable.
Laad de assembly.
Compileer deze.
In deze assembly zit een aanroep naar een methode in de executable,
deze aanroep krijg ik niet aan de praat.

Ik gebruik CompileAssemblyFromSource om de assembly te compileren.

Groeten,

Kalin

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat lukt er niet aan? Als je een instance hebt kun je daar toch gewoon een methode op aanroepen ( eventueel via reflection als je compile-time het type nog niet hebt )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
Ik krijg als errormelding:

De methode NewAuction is niet gedeclareerd.

Ik heb de volledige sourcecode op 'niet mee beschikbaar' gezet.

Het gaat hier om de implementatie van een bordspel,
de problemen zitten in het bestand: Proj18xx 2009\bin\Debug\GameSet\1830\Stockmarket.vb

Dit bestand wordt dynamisch gecompileerd in de class clsStockRound.

[ Voor 6% gewijzigd door Kalin848 op 22-04-2009 10:13 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De file die je aangeeft zit volgens mij niet in je zip. Maar ik heb ook liever dat je gewoon de method/regel aangeeft waar het fout gaat.

Gaat het overigens fout tijdens het compilen of het runnen van de code?

Weet je zeker dat het type waar je NewAuction op aan wil roepen die methode wel heeft?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
Tijdens het runnen van de code gaat het fout.

Als de vb-file gecompileerd wordt struikelt hij. De methode NewAuction is te vinden in de module modStockRound en maakt geen deel uit van een type.

de vb-file die gecompileerd wordt is geen onderdeel van het project maar staat als losse file in de directory
Proj18xx 2009\bin\Debug\GameSet\1830\ en heet StockRound.vb

De class waarin hij struikelt is de CheckCompilerResults method in de class clsDynamicCompilation

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kalin848 schreef op dinsdag 14 april 2009 @ 15:40:
Tijdens het runnen van de code gaat het fout.

Als de vb-file gecompileerd wordt struikelt hij. De methode NewAuction is te vinden in de module modStockRound en maakt geen deel uit van een type.
Dus eigenlijk gaat het compile-time fout ( Alleen gebeurt het compilen van de betreffende code run-time ). Probeer dezelfde code dan eens in een apart project gewoon via VS.NET te compilen. Dat gaat dan waarschijnlijk ook fout, wat er dus op wijst dat je code niet goed is
de vb-file die gecompileerd wordt is geen onderdeel van het project maar staat als losse file in de directory
Proj18xx 2009\bin\Debug\GameSet\1830\ en heet StockRound.vb

De class waarin hij struikelt is de CheckCompilerResults method in de class clsDynamicCompilation
Moet je dan niet modStockRound.NewAuction() aanroepen? Ik weet niet precies hoe modules in VB.NET werken. Als ik zo snel even kijk is een module eigenlijk een compleet static ( Shared in VB.NET ) class, dus dan moet je denk ik nog wel aangeven uit welke module je een method aanroept.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Sowieso vraag ik mij af wat het nut is om met runtime compilation te gaan stoeien, terwijl dit zoals ik het zie een typisch plug-in concept is en dus prima met het runtime laden van dlls kan worden opgelost. Het lijkt mij dat je het jezelf nu enorm moeilijk aan het maken bent.

Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
@Woy
Heb ik al geprobeerd, ook als ik de module er wel voorzet werkt het niet....

@Bigbeng
Wat mijn bedoeling is is om iedereen de mogelijkheid te geven om de game logica aan te passen. Dit kan ik in een dll doen maar het is eenvoudiger om dit in een platte vb of csharp file te laten doen....

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Kalin848 schreef op dinsdag 14 april 2009 @ 11:27:
De code in de runtime gecompileerde assembly aanroepen lukt mij wel.....
Maar nu wil ik vanuit deze code een methode in de aanroepende assembly gebruiken.

Ik start dus mijn executable.
Laad de assembly.
Compileer deze.
In deze assembly zit een aanroep naar een methode in de executable,
deze aanroep krijg ik niet aan de praat.

Ik gebruik CompileAssemblyFromSource om de assembly te compileren.
CompileAssemblyFromSource geeft een CompilerResults instantie terug. Heb je al een de Errors property gecontrolleerd. De Output property geeft alle compiler output terug. Op het moment dat het compiler ergens niet goed lijkt te gaan, zijn dit toch de plaatsen waar je eigenlijk als eerste met je zoektocht moet beginnen.

Als ik heel erg ver terug graaf naar mijn VB tijdperk is een VB module eigenlijk vergelijkbaar met een static class in c#. VB kent een functie CallByName welke het werken met 'static' methods eenstuk gemakkelijker maakt:

Visual Basic:
1
2
3
Public Sub StartStockRound(ByVal Phase As String)
    CallByName("modStockRound", "NewAction", Microsoft.VisualBasic.CallType.Method, nothing);
End Sub

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:17
Kalin848 schreef op dinsdag 14 april 2009 @ 20:56:
@Bigbeng
Wat mijn bedoeling is is om iedereen de mogelijkheid te geven om de game logica aan te passen. Dit kan ik in een dll doen maar het is eenvoudiger om dit in een platte vb of csharp file te laten doen....
Is het dan niet handiger om de class een event te geven waaraan je in je hoofdprogramma acties kunt hangen? ( door de class in de losse module een bepaalde interface te laten implementeren/af te leiden van een basisclass )

In het andere geval zal je hoofdprogramma een publieke interface moeten hebben die je vanuit je 'plugin' kunt benaderen.

[ Voor 10% gewijzigd door farlane op 15-04-2009 10:29 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 21-08 10:56
compilerResults.Errors geeft de unhandled exception '1 errors\nLine 11: De naam NewAuction is niet gedeclareerd.' terug.

Ik heb, voor de mensen die beter bekend zijn met CSharp, het voorbeeld dat ik gebruikt heb, om de dynamic compilation voor elkaar te krijgen, zo aangepast dat ik hierin exact hetzelfde doe als wat ik in mijn code voor elkaar wil krijgen.
De niet werkende aanroep is de volgende:
dynamiccompilation.exe dynamiccompileexample.cs math callbacktest

In program.cs staat een methode Test.
Deze wil ik vanuit de dynamisch gecompileerde dynamiccompileexample.cs (te vinden in bin/debug) aanroepen.

De zipfile met de bestanden is te vinden op 'niet meer beschikbaar'.

[ Voor 5% gewijzigd door Kalin848 op 22-04-2009 10:13 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
probeer NewAuction eens aan te roepen met de Fully Qualified Name. Ik heb het idee dat je gewoon niet de juiste namespaces hebt geinclude of mischien heb je bij het compilen niet de juiste assemblies meegegeven.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:39
Kalin848 schreef op dinsdag 14 april 2009 @ 20:56:
@Woy
Heb ik al geprobeerd, ook als ik de module er wel voorzet werkt het niet....

@Bigbeng
Wat mijn bedoeling is is om iedereen de mogelijkheid te geven om de game logica aan te passen. Dit kan ik in een dll doen maar het is eenvoudiger om dit in een platte vb of csharp file te laten doen....
Het voordeel van werken met assemblies en interfaces voor extensions is juist dat references e.d. al kloppen de code al gecompileerd en gevalideerd is. En zo zijn er vast nog veel meer voordelen aan...

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1