Oppure

Loading
28/08/08 10:07
Thejuster
Chiedo a chi ne sà piu di me.

Se e possibile una cosa del genere

in vb6 se non sbaglio esisteva una libreria
che permetteva di caricare moduli scritti in un secondo momento da qualcun'altro
tipo come un plug-in

Questo sistema mi serveribbe moltissimo
per dare la possibilità agli utenti di aggiungere script personalizzati nel mio game engine.

qualcuno potrebbe aprirmi la mente se e possibile o magari mostrarmi qualche guida al riguardo?

grazie :k:
Ultima modifica effettuata da Thejuster 28/08/08 10:07
mire.forumfree.it/ - Mire Engine
C# UI Designer
30/08/08 9:46
Il Totem
E' possibile, usando un oggetto VBCompiler. Esempio:
Imports System.Runtime.InteropServices
Imports System.CodeDomDim 

'...

Dim Params As New Compiler.CompilerParameters
Dim CodeProvider As CodeDom.Compiler.CodeDomProvider
Dim Result As Compiler.CompilerResults

'Inizializza il compilatore
CodeProvider = New Microsoft.VisualBasic.VBCodeProvider
'Aggiunge i riferimenti necessari
Params.ReferencedAssemblies.Add("System.dll")

'Dato che vuoi creare un dll dal codice esterno,
'imposti GenerateExecutable = False
Params.GenerateExecutable = False

'Compila il codice
Result = CodeProvider.CompileAssemblyFromSource(Params, "Codice (stringa)")

'Se ci sono errori, vede quali sono
If Result.Errors.Count > 0 Then
  For Each [Error] As Compiler.CompilerError In Result.Errors
    'Enumera tutti gli errori del codice
    'Potresti visualizzare dei messagebox di errore
  Next
End If

Alla fine, la proprietà Result.PathToAssembly restituisce il percorso della dll creata (nella cartella temporanea). Ora che hai trasformato il sorgente in libreria, puoi usare la reflection per eseguire il codice ivi contenuto. Vedi:
totem.altervista.org/guida/versione2/…
e seguenti.

Se, ad esempio il tuo codice è questo:
Class Plugin
  Sub DisplayMsg()
    MessageBox.Show("Ciao")
  End Sub
End Class

Puoi creare una classe Plugin partendo dal percorso dell'asembly così:
'Path dovrebbe assumere il valore di Result.PathToAssembly
Dim Path As String
Dim Asm As Assembly = Assembly.LoadFrom(Path)
Dim Plugin As Object

'Crea l'oggetto plugin
Plugin = Asm.CreateInstance("Plugin")

'Ottiene i suoi metodi
Dim Methods() As Reflection.MemberInfo = _
  Plugin.GetType.GetMethods()

'Li controlla tutti
For Each MI As Reflection.MethodInfo In Methods
  'Prende quello che si chiama DisplayMsg
  If MI.Name = "DisplayMsg" Then
    'Lo invoca dall'oggetto Plugin. Nothing significa
    'che a questo metodo non vengono passati parametri
     MI.Invoke(Plugin, Nothing)
  End If
Next
aaa