如何使用 Activator.CreateInstance 从系统 dll 加载类型?
How to load type from system dll using Activator.CreateInstance?
.Net 4.5.2 和 4.6.2,MSTest 单元测试:
出于测试用例的目的,我需要通过在数据文件中将 class 名称指定为字符串来创建 'system' 对象。我只知道运行时所需的类型作为字符串类型名称(可能是完全限定的)。
我试过比较正统的方法
var assyName = "System"; //read from data file
var typeName = "System.Boolean"; //read from data file
var hndle = Activator.CreateInstance(assyName, typeName);
var obj = hndle.Unwrap();
var t = obj.GetType();
但是如果我从我自己的程序集中加载我自己的类型,这会起作用,如果我尝试使用 .Net 程序集(如上所述),Activator 行会抛出一个 FileNotFound例外。我尝试将引用的系统程序集 Copy Local 属性 更改为 true,但这似乎没有效果。我也试过指定系统程序集的完整路径,但没有成功。
所以问题是:我做错了什么,以及(如果没有错的话)我如何实现我的目标?
你的数据文件有误。
System.Boolean
类型,就像 System
命名空间中的许多其他类型驻留在 mscorlib
程序集中,而不是在该数据文件声明的 System
程序集中.命名空间名称和程序集名称之间没有关系。
您可以在该类型的 MSDN 页面上查看哪个程序集包含该类型。
例如 System.Uri
is in System.dll
, but System.Boolean
在 mscorlib.dll
.
.Net 4.5.2 和 4.6.2,MSTest 单元测试:
出于测试用例的目的,我需要通过在数据文件中将 class 名称指定为字符串来创建 'system' 对象。我只知道运行时所需的类型作为字符串类型名称(可能是完全限定的)。
我试过比较正统的方法
var assyName = "System"; //read from data file
var typeName = "System.Boolean"; //read from data file
var hndle = Activator.CreateInstance(assyName, typeName);
var obj = hndle.Unwrap();
var t = obj.GetType();
但是如果我从我自己的程序集中加载我自己的类型,这会起作用,如果我尝试使用 .Net 程序集(如上所述),Activator 行会抛出一个 FileNotFound例外。我尝试将引用的系统程序集 Copy Local 属性 更改为 true,但这似乎没有效果。我也试过指定系统程序集的完整路径,但没有成功。
所以问题是:我做错了什么,以及(如果没有错的话)我如何实现我的目标?
你的数据文件有误。
System.Boolean
类型,就像 System
命名空间中的许多其他类型驻留在 mscorlib
程序集中,而不是在该数据文件声明的 System
程序集中.命名空间名称和程序集名称之间没有关系。
您可以在该类型的 MSDN 页面上查看哪个程序集包含该类型。
例如 System.Uri
is in System.dll
, but System.Boolean
在 mscorlib.dll
.