Eguire codice esterno non compilato

mercoledì 13 ottobre 2010 - 13.12
Tag Elenco Tags  VB.NET  |  Visual Studio 2008

alexvt Profilo | Newbie

Sto facendo un programma per l'Export dei dati in formato testo da una applicazione ad un gestionale Cobol (purtroppo tra i commercialisti e' ancora diffuso ) , tutto perfetto il tracciato record e' abbastanza semplice, quindi faccio il solito archivietto esterno con il nome dei campi da esportare , la loro lunghezza ecc.ecc. ora e' sorto un problema su una istanza condizionale che varia su diversi campi , tipo un campo esportato e' il risultato della lunghezza del contenuto di un'altro ecc.ecc. , la mia idea era di scrivere direttamente il codice in un campo tipo

If Len(nomecampo) >0 then

stringaesp =len(nomecampo)

endif

e poi farglielo eseguire . Domanda e' possibile ? Se si come posso farlo eseguire ?

freeteo Profilo | Guru

Ciao,
io usavo questo codice per eseguire del codice a runtime direttametne da stringa, è in C# ma lo puoi facilmente convertire in vb.net usando questo:
http://www.carlosag.net/Tools/CodeTranslator/
ti lascio anche il sorgente in C# perchè il traduttore non sempre è perfetto...ecco il codice:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.CSharp; using System.CodeDom.Compiler; using System.Reflection; using System.IO; using System.Drawing.Printing; namespace WinTMP.Managers { public class CodeManager { public static object Execute(string csharpCode) { object result = null; CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("System.dll"); cp.ReferencedAssemblies.Add("System.Xml.dll"); cp.ReferencedAssemblies.Add("System.Data.dll"); cp.CompilerOptions = "/t:library"; cp.GenerateExecutable = false; cp.GenerateInMemory = true; //--- scrivo il codice sorgente string codice = "using System;\r\n" + "using System.Xml;\r\n" + "using System.Data;\r\n" + "using System.Data.SqlClient;\r\n" + "namespace RuntimeEval { \r\n" + "public class Evaluator {\r\n" + "public object Run() {\r\n" + csharpCode + "\r\n" + "}\r\n" + "}\r\n" + "}"; try { //--- compilo ed eseguo CompilerResults cr = provider.CompileAssemblyFromSource(cp, codice); Assembly ass = cr.CompiledAssembly; object obj = ass.CreateInstance("RuntimeEval.Evaluator"); Type t = obj.GetType(); MethodInfo method = t.GetMethod("Run"); result = method.Invoke(obj, null); //--- cancello il file temporaneo if (File.Exists(cr.PathToAssembly)) File.Delete(cr.PathToAssembly); } catch { } return result; } } }
che veniva chiamato ad esempio con:
string query = "DataTable table = new DataTable();" + "using (SqlConnection conn = new SqlConnection(@\"Data Source=.\...;\"))" + "{" + " SqlCommand cmd = conn.CreateCommand();" + " cmd.CommandText = \"SELECT nominativo, codice FROM clienti\"; "+ " "+ " conn.Open(); "+ " table.Load(cmd.ExecuteReader()); " + "}" + "return table;"; dataGridView1.DataSource = CodeManager.Execute(query);

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

alexvt Profilo | Newbie

Scusami nel ritardo nella risposta ma ero fuori , Ok cosi' credo che possa andare , adesso la converto in VB e poi ti dico . Grazie tantissimo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5