未找到类型“System.RuntimeType”上的构造函数。

   object obj1 = Activator.CreateInstance(type, args);

System.RuntimeType是从抽象基类派生的具体类System.Type。

由于System.RuntimeType不是公开的,因此您通常会遇到的实例System.Type。

当您试图获取一个对象的类型并错误地调用GetType()另一个代表第一个对象类型的对象时,

可能会产生混乱,而不仅仅是直接使用该对象。

然后,当调用该对象的对象表示Type时Type.ToString()将返回"System.RuntimeType":

string str = string.Empty;

Type strType = str.GetType();

Type strTypeType = strType.GetType();

strType.ToString();     // returns "System.string"

strTypeType.ToString(); // returns "System.RuntimeType"

例如,在此博客文章中,有人试图获取数据库中列的类型,例如:

object val = reader.GetFieldType(index);

Type runtimeType = val.GetType();

PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");

Type type = (Type)propInfo.GetValue(val, null);

由于val已经是Type对象,所以val.GetType()将返回另一个表示该类型的Type对象,System.RuntimeTime因为这是用于表示原始类型对象的具体类型。然后,该博客文章显示了一些不必要的反射技巧,以获取原始类型对象的类型,而实际上所需要做的只是:

Type type = reader.GetFieldType(index) as Type;

因此,如果您的Type对象报告它表示一个System.RuntimeType,请确保您没有意外调用GetType()您已经拥有的类型。

其他

C#生成/调用动态链接库

一、需求描述

  (1)用代码生成动态链接库

  (2)用C#代码调用动态链接库

二、生成动态链接库

  (1)新建类库

(2)添加WelcomeInfo类

代码如下(仅供测试用,例子很简单):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GenerateDLL
{
    public class WelcomeInfo
    {
        public string ShowMsg(string name)
        {
            string str = "welcome " + name;
            return str;
        }
    }
}

(3)生成DLL动态链接库

生成的dll在这里啦

 

二、c#调用dll

  (1)新建一个控制台程序

  (2)方法一

Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");

            //获取类型,参数(命名空间+类)
            Type type = assembly.GetType("GenerateDLL.WelcomeInfo");

            //创建该对象的实例,object类型,参数(命名空间+类)
            object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo");

            //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个
            Type[] params_type = new Type[1];
            params_type[0] = Type.GetType("System.String");
            //设置方法中的参数值;如有多个参数可以追加多个
            Object[] params_obj = new Object[1];
            params_obj[0] = "Lucy";

            //执行ShowMsg方法
            string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
            Console.WriteLine(str);
            Console.Read();

(3)方法二

Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
            //获取类型,参数(命名空间 + 类)
            Type typeDBHelpher = assembly.GetType("GenerateDLL.WelcomeInfo");
            object oDBHelper = Activator.CreateInstance(typeDBHelpher);
            //需要调用的方法名
            MethodInfo method = typeDBHelpher.GetMethod("ShowMsg");
            //参数集合
            object v = method.Invoke(oDBHelper, new object[] { "Lucy" });
            string str = v.ToString();
            Console.WriteLine(str);
            Console.Read();

说明:两个方法大同小异,只是个别写法不一样,我个人更喜欢用第一种方法,感觉思路更清晰。

(3)效果

三、调用dll一次之后,就不能进行调用了,提示dll被占用的解决方案

 

//Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
            //此处改成这种方式即可
            byte[] byteDLL = System.IO.File.ReadAllBytes("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
            Assembly assembly = Assembly.Load(byteDLL);
            //获取类型,参数(命名空间+类)
            Type type = assembly.GetType("GenerateDLL.WelcomeInfo");

            //创建该对象的实例,object类型,参数(命名空间+类)
            object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo");

            //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个
            Type[] params_type = new Type[1];
            params_type[0] = Type.GetType("System.String");
            //设置方法中的参数值;如有多个参数可以追加多个
            Object[] params_obj = new Object[1];
            params_obj[0] = "Lucy";

            //执行ShowMsg方法
            string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
            Console.WriteLine(str);
            Console.Read();

疑问:之前是在同一个页面既生成dll,又调用dll,就会出现“被占用”的错误,而且也无法多次调用同一dll。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。

posted @ 2021-07-11 20:54  cao919  阅读(411)  评论(0编辑  收藏  举报