supporto per script in un'applicazione C # [chiuso]

0

qual è il modo più semplice e veloce per supportare lo scripting semplice in un'applicazione .Net? Cerco molto ma trovo molte cose prive di documentazione o obsolete da anni. Ho solo bisogno di trasferire un oggetto .Net semplice allo script e ottenere un risultato bool da esso.

    
posta Sebastian 09.09.2013 - 15:06
fonte

5 risposte

5

Dipende dalle tue esigenze precise. Due modi in cui posso pensare:

  • Usa un linguaggio come Python che è interoperabile con C # e chiama lo script Python da C #. In realtà, puoi persino semplificare le cose semplicemente chiamando un eseguibile, passando ad esso dati XML o JSON e attendi la risposta XML o JSON.

  • Se hai bisogno di usare C #, compila C # al volo, proprio come fa LINQPad . È possibile compilare ed eseguire dinamicamente frammenti di codice C #? è un buon punto di partenza. Il caricamento del codice in una sandbox (in un diverso AppDomain ) è anche una buona idea se devi fornire abbastanza sicurezza e non fidarti del codice che può essere scritto dall'utente.

risposta data 09.09.2013 - 15:29
fonte
3

Penso che il modo più semplice sarebbe utilizzare uno dei linguaggi di scripting .Net già esistenti, come IronPython o IronRuby.

Ad esempio, con IronPython puoi scrivere il tuo codice di script in Python, eseguirlo dall'applicazione C # e poi elaborare i risultati dallo script.

Il codice potrebbe essere simile a questo:

var engine = Python.CreateEngine();
var scope = engine.CreateScope();
scope.SetVariable("value", 43);

var code = @"
# overcomplicated just to show it's really Python
def areEqual (value1, value2):
    return value1 == value2

areEqual(value, 42)";

Console.WriteLine(engine.Execute<bool>(code, scope));

Un'altra opzione sarebbe utilizzare le funzionalità di scripting di Roslyn, ma non è ancora pronto per la produzione.

    
risposta data 09.09.2013 - 15:37
fonte
1

Un altro linguaggio di scripting che dovresti prendere in considerazione è PowerShell. C'è un esempio pienamente funzionante di un'applicazione che espone alcuni dei suoi oggetti interni a un ambiente di script qui .

Questa è la descrizione dell'applicazione dal libro (sottolineatura mia):

The reference application for this chapter, Beaver Music, is a very simple music album management system. It supports create, read, update, and delete (CRUD) actions for albums. Beaver Music has the functionality you’d expect—a couple of dialogs for adding and changing album information, and you can delete albums as well. What we want to focus on is the PowerShell Console button (shown in Figure 5-1), a WPF application that has the PowerShell engine embedded in it. As noted earlier, PowerShell is surfaced as a console, a scripting language, and an API; the custom PowerShell console uses this surfaced API in conjunction with the Beaver Music application so it can be scripted and automated. This works similarly to the way Microsoft Excel can be automated with the embedded Visual Basic for Applications (VBA) scripting language.

    
risposta data 10.09.2013 - 16:37
fonte
0

Potresti creare una classe temporanea e invocare un metodo su quello

var template = @"public static class Temp
{{
  public static bool Run()
  {{
      return {0};
  }}
}}";

var script = "1 < 2";

var source = string.Format(template, script);

var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } });
var parameters = new CompilerParameters(new[] { "mscorlib.dll" }, "temp.dll", true);
parameters.GenerateExecutable = false;
var results = csc.CompileAssemblyFromSource(parameters, source);
var type = results.CompiledAssembly.GetType("Temp");
var method = type.GetMethod("Run");
var result = (bool)method.Invoke(null, null);
Console.WriteLine(result);

Ma devi davvero fidarti delle persone che scrivono gli script. Basta aggiungere parametri al metodo Run per passare il tuo oggetto.

    
risposta data 09.09.2013 - 15:31
fonte
-1

Il più veloce e semplice? Spero davvero che non sia così, ma come ultima risorsa, puoi usare il metodo .NET Emit per creare codice CIL creato a mano che generi dinamicamente nel tuo programma.

Se il tuo requisito di scripting è davvero banale, allora è probabilmente un mese o due di lavoro. Puoi elaborare il set di istruzioni CIL dall'uso di un riflettore per vedere come il compilatore traduce il tuo codice C # in CIL e quindi "prendere in prestito" questi frammenti di codice.

    
risposta data 09.09.2013 - 15:17
fonte

Leggi altre domande sui tag