1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| lcCode = @"
using System;
using System.Linq;
using System.Collections.Generic;
using System.Data;
namespace ImportData {
public class GetUpdatedTable {
public DataTable RunDynamicLinq(string ForeignKey, DataTable SourceTable, DataTable ForeignTable, DataTable ToInsertTable, List<Map> toInsertMapList) {
" + lcCode +
@"}
}
}";
RunCodeText rc = new RunCodeText();
// rc.DynamicCode(dt, mapList);
CSharpCodeProvider cp = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v3.5" } });
ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler();
CompilerParameters loParameters = new CompilerParameters();
// *** Start by adding any referenced assemblies
loParameters.ReferencedAssemblies.Add("System.dll");
loParameters.ReferencedAssemblies.Add("mscorlib.dll");
loParameters.ReferencedAssemblies.Add("System.Core.dll");
loParameters.ReferencedAssemblies.Add("System.Xml.dll");
loParameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
loParameters.ReferencedAssemblies.Add("System.Data.dll");
loParameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
// *** Load the resulting assembly into memory
loParameters.GenerateInMemory = true;
// *** Now compile the whole thing
CompilerResults loCompiled = cp.CompileAssemblyFromSource(loParameters, lcCode);
if (loCompiled.Errors.HasErrors)
{
string lcErrorMsg = "";
// *** Create Error String
lcErrorMsg = loCompiled.Errors.Count.ToString() + " Errors:";
for (int x = 0; x < loCompiled.Errors.Count; x++)
lcErrorMsg = lcErrorMsg + "\r\nLine: " + loCompiled.Errors[x].Line.ToString() + " - " +
loCompiled.Errors[x].ErrorText;
MessageBox.Show(lcErrorMsg + "\r\n\r\n" + lcCode, "Compiler Demo", MessageBoxButtons.OK, MessageBoxIcon.Error);
//return;
}
//this.txtAssemblyCode.Text = lcCode;
Assembly loAssembly = loCompiled.CompiledAssembly;
// *** Retrieve an object reference - since this object is 'dynamic' we can't explicitly // *** type it so it's of type Object
object loObject = loAssembly.CreateInstance("ImportData.GetUpdatedTable");
//if (loObject == null) à traiter comme exception
//{
// //MessageBox.Show("Couldn't load class.");
// return;
//}
object[] loCodeParms = new object[5];
loCodeParms[0] = ForeignKey;
loCodeParms[1] = SourceTable;
loCodeParms[2] = ForeignTable;
loCodeParms[3] = DestinationTable;
loCodeParms[4] = toInsertMapList;
try
{
object loResult = loObject.GetType().InvokeMember("RunDynamicLinq",
BindingFlags.InvokeMethod, null, loObject, loCodeParms);
DataTable outTable = (DataTable)loResult;
return outTable;
// MessageBox.Show("Method Call Result:\r\n\r\n" + outTable.Rows.Count, "Compiler Demo", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception loError)
{
// MessageBox.Show(loError.Message, "Compiler Demo", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
return null; |
Partager