无法在 c# 中使用 reflection/Assembly/Activator 从字符串实例化对象
Cannot instantiate object using reflection/Assembly/Activator in c# from a string
我有一个定义了 class 的命名空间(我将省略代码):
namespace My.Business.Services
{
public class ProgressSender
{
}
}
此项目已保存为 DLL。
在我解决方案的另一个项目中,我尝试以各种方式实例化它(实际上这是我的 app.config 中的一个字符串)但它们都失败了(它确实有效地创建了 class代码中的早期绑定)。我也将 My.Business.Services 作为程序的参考:
namespace My.Progress.Imaging
{
static class Program
{
static void Main(string[] args)
{
string exportItemNS = "My.Business.Services";
string exportItemC = "ProgressSender";
string exportItemFull = "My.Business.Services.ProgressSender";
//value cannot be null
ProgressSender obj =
(ProgressSender)Activator.CreateInstance(Type.GetType(exportItemFull));
//could not load type 'ProgressSender' from assembly 'My.Business.Services'
var obj=Activator.CreateInstance(exportItemNS, exportItemC);
//could not load type 'ProgressSender' from assembly 'My.Business.Services'
ProgressSender s=(ProgressSender)Activator.CreateInstance(null, exportItemFull);
//Loads ok but then classType is null
Assembly assembly;
assembly = Assembly.Load(exportItemNS);
Type classType = assembly.GetType(exportItemC);
}
}
}
如果我从同一个命名空间甚至系统中获取一个类型,那没问题:
Type t = Type.GetType("My.Progress.Imaging.Program");
t = Type.GetType("System.String");
您需要指定完整的程序集限定名。只有 mscorlib 和系统类型可以提供不带程序集名称的类型名称。
所以在你的情况下:
"My.Business.Services.ProgressSender, My.Business.Services"
如果您的类型在 My.Business.Services.dll 程序集中。
见https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx
我有一个定义了 class 的命名空间(我将省略代码):
namespace My.Business.Services
{
public class ProgressSender
{
}
}
此项目已保存为 DLL。
在我解决方案的另一个项目中,我尝试以各种方式实例化它(实际上这是我的 app.config 中的一个字符串)但它们都失败了(它确实有效地创建了 class代码中的早期绑定)。我也将 My.Business.Services 作为程序的参考:
namespace My.Progress.Imaging
{
static class Program
{
static void Main(string[] args)
{
string exportItemNS = "My.Business.Services";
string exportItemC = "ProgressSender";
string exportItemFull = "My.Business.Services.ProgressSender";
//value cannot be null
ProgressSender obj =
(ProgressSender)Activator.CreateInstance(Type.GetType(exportItemFull));
//could not load type 'ProgressSender' from assembly 'My.Business.Services'
var obj=Activator.CreateInstance(exportItemNS, exportItemC);
//could not load type 'ProgressSender' from assembly 'My.Business.Services'
ProgressSender s=(ProgressSender)Activator.CreateInstance(null, exportItemFull);
//Loads ok but then classType is null
Assembly assembly;
assembly = Assembly.Load(exportItemNS);
Type classType = assembly.GetType(exportItemC);
}
}
}
如果我从同一个命名空间甚至系统中获取一个类型,那没问题:
Type t = Type.GetType("My.Progress.Imaging.Program");
t = Type.GetType("System.String");
您需要指定完整的程序集限定名。只有 mscorlib 和系统类型可以提供不带程序集名称的类型名称。
所以在你的情况下:
"My.Business.Services.ProgressSender, My.Business.Services"
如果您的类型在 My.Business.Services.dll 程序集中。
见https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx