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 میتونین ببینین . ممنون از کمک تون