无法在 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