public NeldorMid(object evaluatorInstance, int nMer) { ContractHlp.Assert(evaluatorInstance != null, "Error 9451610. Исполнительный файл для подсчета отклонений не найден."); _evaluatorInstance = evaluatorInstance; _nMer = nMer; }
public double[,] Evaluator(string expression, double start, double finish, double step) { var n = 0; string code = string.Empty; code += "using System;"; code += "namespace CSEvaluator"; code += "{ public class Evaluate"; code += " { public double GetResult(int number){ return(" + expression.Replace("x", "EvaluatorXY[0,number]") + "); }"; code += " private void Reader()"; code += " {"; for (double i = start; i >= finish; i = i - step) { n++; code += " EvaluatorXY[0," + (n - 1) + "] = " + Math.Round(i, 4).ToString(CultureInfo.InvariantCulture) + ";"; } code += " }"; code += " private double Pow(double arg, double leaf)"; code += " {"; code += " if (arg > 0) return Math.Pow(arg, leaf);"; code += " double result = 0;"; code += " int floatlenght = 0;"; code += " double tmp = arg;"; code += " while ((int)tmp % 10 == 0 && tmp!=0)"; code += " {"; code += " tmp *= 10;"; code += " floatlenght++;"; code += " }"; code += " bool negatArg = false;"; code += " if ((leaf ) % 2 != 0 )"; code += " {"; code += " arg = arg * -1;"; code += " negatArg = true;"; code += " }"; code += " result = Math.Pow(arg, leaf);"; code += " if (negatArg == true) result = result * -1;"; code += " return result;"; code += " }"; code += " private double Cos(double arg) { return Math.Cos(arg); }"; code += " private double Sin(double arg) { return Math.Sin(arg); }"; code += " private double Tan(double arg) { return Math.Tan(arg); }"; code += " private double EXP(double arg) { return Math.Exp(arg); }"; code += " private double Log(double leaf, double arg) { return Math.Log(arg, leaf); }"; code += " double[,] EvaluatorXY = new double[2," + n + "];"; code += " public void GetEvaluatorXY()"; code += " {"; code += " Reader();"; code += " for (int i = 0;i<=" + (n - 1) + ";i++)"; code += " EvaluatorXY[1,i] = Math.Round(GetResult(i),4);"; code += " }"; code += " public double[,] GetResultEvaluatorXY()"; code += " {"; code += " GetEvaluatorXY();"; code += " return EvaluatorXY;"; code += " }"; code += " }"; code += "}"; var ccParams = new CompilerParameters { //CompilerOptions = "/t:library", GenerateInMemory = true, IncludeDebugInformation = true, GenerateExecutable = false, OutputAssembly = "Evaluate.dll", CompilerOptions = "/optimize", TempFiles = new TempFileCollection(".", false) }; ccParams.ReferencedAssemblies.Add("system.dll"); CodeDomProvider compileProvider = CodeDomProvider.CreateProvider("CSharp"); var results = compileProvider.CompileAssemblyFromSource(ccParams, code); var assembly = results.CompiledAssembly; var evaluator = assembly.CreateInstance("CSEvaluator.Evaluate"); ContractHlp.Assert(evaluator != null, "Erorr 16420203. Не удалось собрать компилятор."); var result = (double[, ])evaluator.GetType().InvokeMember("GetResultEvaluatorXY", BindingFlags.InvokeMethod, null, evaluator, new object[] { }, null, null, null); return(result); }