Domanda

Di recente mi sono imbattuto in una breve discussione su un altro sito sulla compilazione di runtime C # durante la ricerca di qualcos'altro e ho pensato che l'idea fosse interessante. L'hai mai usato? Sto cercando di determinare come / quando si potrebbe usare questo e quale problema risolve. Sarei molto interessato a sapere come l'hai usato o in quale contesto ha senso.

Grazie mille.

È stato utile?

Soluzione

In genere, lo vedo usato nei casi in cui stai utilizzando Reflection e devi ottimizzare le prestazioni.

Ad esempio, invece di utilizzare la riflessione per chiamare il metodo X, in fase di esecuzione si genera un metodo dinamico per farlo.

Altri suggerimenti

Puoi usarlo per aggiungere il supporto di scripting alla tua applicazione. Per esempi, guarda qui o qui .

È abbastanza facile pubblicare parti del framework dell'oggetto interno nella parte di scripting, in modo da poter aggiungere con relativa facilità qualcosa all'applicazione che ha lo stesso effetto, ad esempio VBA per Office.

L'ho visto (compilazione / utilizzo di runtime delle classi System.Reflection.Emit) nella generazione di proxy dinamici ( Esempio di progetto di codice ) o altri mezzi per ottimizzare le chiamate di riflessione (in termini di tempo).

Almeno un caso che potresti usare è quando si genera codice dinamico. Ad esempio, il framework lo utilizza internamente per generare al volo serializzatori XML. Dopo aver esaminato una classe in fase di runtime, può generare il codice per serializzare / deserializzare la classe. Quindi compila quel codice e lo utilizza come necessario. Allo stesso modo è possibile generare codice per gestire tabelle DB arbitrarie ecc., Quindi compilare e caricare l'assembly generato.

Bene, tutto il codice C # è compilato in fase di esecuzione, poiché è un compilatore JIT (just-in-time). Suppongo che ti riferisci a Reflection. Ammetti di creare classi ecc. Al volo. Ecco un esempio che ho visto di recente nella libreria Xml-Rpc.Net.

Creo un'interfaccia C # che ha la stessa firma delle chiamate di metodo di un servizio XML-RPC, ad es.

IMyProxy : IXmlRpcProxy
{
    [XmlRpcMethod]
    int Add(int a, int b);
}

Quindi nel mio codice chiamo qualcosa del tipo

IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));

Questo utilizza la generazione di codice runtime per creare un proxy completamente funzionale per me, quindi posso usarlo in questo modo:

int result = proxy.Add(1, 2);

Questo quindi gestisce la chiamata XML-RPC per me. Abbastanza bello.

Nella mia tesi di diploma ho usato i servizi di compilazione runtime di .NET. Fondamentalmente, si trattava di creare visivamente un componente grafico per una visualizzazione di processo, che viene generato come codice C #, compilato in un assembly e può quindi essere utilizzato sul sistema di destinazione senza essere interpretato, per renderlo più veloce e più compatto. E, come bonus, le immagini generate potrebbero essere raggruppate nello stesso assieme delle risorse.

L'altro uso era in Java. Avevo un'applicazione che doveva tracciare una funzione potenzialmente costosa usando un algoritmo numerico (era tornato all'università) che l'utente poteva inserire. Ho inserito la funzione inserita in una classe, l'ho compilata e caricata ed era quindi disponibile per un'esecuzione relativamente veloce.

Quindi, queste sono le mie due esperienze in cui la generazione del codice di runtime è stata una buona cosa.

qualcosa per cui l'ho usato era per consentire l'esecuzione del codice C # e VB da parte dell'utente ad-hoc. Potrebbero digitare una riga di codice (o un paio di righe) e verrebbero compilati, caricati in un dominio dell'app, eseguiti ed infine scaricati. Questo probabilmente non è il miglior esempio del suo utilizzo, ma comunque un esempio

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top