50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

رفرنس در codedomprovider

سلام

من با codedomprovider  میخوام یک کد داینایک رو اجرا کنم . توی اون کد داینامیک نیاز دارم ک ی کتابخانه مثلا system.linq رو رفرنس بدم . رفرنس رو میدم ولی کد داینامیک نمیتونه متادیتا رفرنس رو پیدا کنه. این هم کدم هست . کسی میتونه کمک کنه؟ ممنون میشم





                var className = "test1234";


                CodeNamespace ns = new CodeNamespace(className );
                
                CodeTypeDeclaration formulaClass =
                    new CodeTypeDeclaration(className)
                    {
                        Attributes = MemberAttributes.Public
                    };

                var constructor = new CodeConstructor { Attributes = MemberAttributes.Public };

                formulaClass.Members.Add(constructor);

                #region generate method

                List<string> UsedValues = new List<string>();
                var counter = 0;
                var formula = @"                 List<string> UsedValues1 = new List<string>();

                for (int i = 0; i < 10; i++)
                {
                    UsedValues1.Add((i * i).ToString());

                }
                var ttt = UsedValues1.FirstOrDefault(x => x.Contains(""2""));
return ttt;
                ";
                var method = new CodeMemberMethod
                {
                    ReturnType = new CodeTypeReference(typeof(bool)),
                    Name = $"M{1}",
                    Attributes = MemberAttributes.Public
                };

                //method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(double[]), "t1"));

                method.Statements.Add(new CodeSnippetExpression(
                $"{formula};"));


                #endregion

                formulaClass.Members.Add(method);
                ns.Types.Add(formulaClass);

                var pUnit = new CodeCompileUnit();
                pUnit.Namespaces.Add(ns);

                var pParams =
                    new CompilerParameters
                    {
                        GenerateInMemory = true,

                    };

                pParams.ReferencedAssemblies.Add(@"System.Linq");
                var provider = CodeDomProvider.CreateProvider("csharp");
                
                var pResults = provider.CompileAssemblyFromDom(pParams, pUnit);
                
                var sw = new StringWriter();

                provider.CreateGenerator(sw).GenerateCodeFromNamespace(ns, sw, new CodeGeneratorOptions()
                {

                });

           

                if (pResults.Errors != null && pResults.Errors.Count > 0)
                {
                    return;
                    foreach (CompilerError pError in pResults.Errors)
                    {

                    }


                }

                var GeneratedClass =
                    pResults.CompiledAssembly.CreateInstance($"{ns.Name}.{formulaClass.Name}");

                double[] t2 = { 1, 2, 3, 4 };
                var methodParams = new List<double[]>();
                var ExecResult = (string)GeneratedClass.GetType()
                                     .InvokeMember($"M{1}",
                                         BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, GeneratedClass,
                                         methodParams.ToArray());
               

---------------

خطا رو توی pResults.Errors میتونین ببینین . ممنون از کمک تون

پرسیده شده در 1399/07/23 توسط

0 پاسخ

این سوال هنوز پاسخی ندارد

پاسخ شما