Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Lettura del source esternamente
Forum - C# / VB.NET - Lettura del source esternamente

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:07
Giovedì, 28/08/2008
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 il 28/08/2008 alle 12:07


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:46
Sabato, 30/08/2008
E' possibile, usando un oggetto VBCompiler. Esempio:
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2. Imports System.CodeDomDim
  3.  
  4. '...
  5.  
  6. Dim Params As New Compiler.CompilerParameters
  7. Dim CodeProvider As CodeDom.Compiler.CodeDomProvider
  8. Dim Result As Compiler.CompilerResults
  9.  
  10. 'Inizializza il compilatore
  11. CodeProvider = New Microsoft.VisualBasic.VBCodeProvider
  12. 'Aggiunge i riferimenti necessari
  13. Params.ReferencedAssemblies.Add("System.dll")
  14.  
  15. 'Dato che vuoi creare un dll dal codice esterno,
  16. 'imposti GenerateExecutable = False
  17. Params.GenerateExecutable = False
  18.  
  19. 'Compila il codice
  20. Result = CodeProvider.CompileAssemblyFromSource(Params, "Codice (stringa)")
  21.  
  22. 'Se ci sono errori, vede quali sono
  23. If Result.Errors.Count > 0 Then
  24.   For Each [Error] As Compiler.CompilerError In Result.Errors
  25.     'Enumera tutti gli errori del codice
  26.     'Potresti visualizzare dei messagebox di errore
  27.   Next
  28. 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:
http://totem.altervista.org/guida/versione2/A44.php
e seguenti.

Se, ad esempio il tuo codice è questo:
Codice sorgente - presumibilmente VB.NET

  1. Class Plugin
  2.   Sub DisplayMsg()
  3.     MessageBox.Show("Ciao")
  4.   End Sub
  5. End Class


Puoi creare una classe Plugin partendo dal percorso dell'asembly così:
Codice sorgente - presumibilmente VB.NET

  1. 'Path dovrebbe assumere il valore di Result.PathToAssembly
  2. Dim Path As String
  3. Dim Asm As Assembly = Assembly.LoadFrom(Path)
  4. Dim Plugin As Object
  5.  
  6. 'Crea l'oggetto plugin
  7. Plugin = Asm.CreateInstance("Plugin")
  8.  
  9. 'Ottiene i suoi metodi
  10. Dim Methods() As Reflection.MemberInfo = _
  11.   Plugin.GetType.GetMethods()
  12.  
  13. 'Li controlla tutti
  14. For Each MI As Reflection.MethodInfo In Methods
  15.   'Prende quello che si chiama DisplayMsg
  16.   If MI.Name = "DisplayMsg" Then
  17.     'Lo invoca dall'oggetto Plugin. Nothing significa
  18.     'che a questo metodo non vengono passati parametri
  19.      MI.Invoke(Plugin, Nothing)
  20.   End If
  21. Next


PM Quote