我有一个简单的项目,我用string value
动态执行一个C# compiler
。
以下代码:
private void btntest_Click(object sender, EventArgs e)
{
string code = @"
using System;
using System.Text;
using System.Data;
using System.Reflection;
using System.ComponentModel;
namespace myNameSpace
{
public class DynamicClass
{
public bool myFunction(DataRow dr)
{
if (dr == null)
return false;
if (dr.Table.Columns.Contains(""Col1"") && (bool)dr[""Col1""] == true)
return true;
else
return false;
}
}
}
";
Assembly asm = BuildAssembly(code);
object instance = null;
Type type = null;
instance = asm.CreateInstance("myNameSpace.DynamicClass");
type = instance.GetType();
DataTable dt = new DataTable();
dt.Columns.Add("Col1");
DataRow dr = dt.NewRow();
dr[0] = true;
MethodInfo method = type.GetMethod("myFunction");
object returnVal = method.Invoke(instance, new object[] { dr });
txtError.Text = returnVal.ToString();
}
Assembly BuildAssembly(string code)
{
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters compilerparams = new CompilerParameters();
compilerparams.GenerateExecutable = false;
compilerparams.GenerateInMemory = false;
compilerparams.ReferencedAssemblies.Add("mscorlib.dll");
compilerparams.ReferencedAssemblies.Add("System.dll");
compilerparams.ReferencedAssemblies.Add("System.Data.dll");
compilerparams.ReferencedAssemblies.Add("System.Xml.dll");
CompilerResults results = codeProvider.CompileAssemblyFromSource(compilerparams, code);
if (results.Errors.HasErrors)
{
StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
foreach (CompilerError error in results.Errors)
{
errors.AppendFormat("Line {0},{1}\t: {2}\n",
error.Line, error.Column, error.ErrorText);
}
throw new Exception(errors.ToString());
}
else
{
return results.CompiledAssembly;
}
}
运行项目时,出现以下错误:
调用的目标已引发异常。
内部异常
InvalidCastException:指定的转换无效。
如果我删除了(bool)dr[""Col1""] == true
部分,则它工作正常。
应该添加什么assembly
或namespace
?
如何解决此错误?
非常感谢您的帮助。
答案 0 :(得分:1)
问题是这一行:
rm -rf var/cache/**
如果未指定类型,则默认为dt.Columns.Add("Col1");
。这意味着该单元格的值将转换为字符串string
。
因此,您应该这样做:
True
答案 1 :(得分:0)
正如您已经指出的,这是导致问题的行:
if (dr.Table.Columns.Contains("Col1") && (bool)dr["Col1"] == true)
将dr["Col1"]
显式转换为bool
失败,因为该值不是布尔值。显式强制转换失败。
假设dr["Col1"]
实际上应该包含一个bool
,但不一定总是包含dr["Col1"] is bool myValue && myValue == true
,则可以使用以下语法在转换之前验证其类型:
dr["Col1"]
以上代码验证了bool
是myValue
,然后将bool
定义为myValue == true
的值。
通过删除myValue
并仅使用true
(因为它将被评估为false
或if (dr.Table.Columns.Contains(""Col1"") && dr[""Col1""] is bool myValue && myValue)
),代码可以变得更加清晰。在您引用的代码中:
dr["Col1"]
如果bool
实际上不包含int
,但实际上包含parameter Integer Ns = integer(ceil(L / dx))
或其他值作为指示符的值为true,则您需要实施不同的逻辑。