未找到类型“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。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。