如何解决“指定的演员表无效”。错误

时间:2019-11-05 10:18:09

标签: c# runtime-error

我有一个简单的项目,我用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部分,则它工作正常。

应该添加什么assemblynamespace

如何解决此错误?

非常感谢您的帮助。

2 个答案:

答案 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"]

以上代码验证了boolmyValue,然后将bool定义为myValue == true的值。

通过删除myValue并仅使用true(因为它将被评估为falseif (dr.Table.Columns.Contains(""Col1"") && dr[""Col1""] is bool myValue && myValue) ),代码可以变得更加清晰。在您引用的代码中:

dr["Col1"]

如果bool实际上不包含int,但实际上包含parameter Integer Ns = integer(ceil(L / dx)) 或其他值作为指示符的值为true,则您需要实施不同的逻辑。