无法在字符串中使用c#中的reflection / Assembly / Activator实例化对象

时间:2015-02-06 18:57:51

标签: c# .net reflection .net-assembly

我有一个定义类的命名空间(我将省略代码):

namespace My.Business.Services
{
    public class ProgressSender
    {
    }
}

此项目保存为DLL。

在我的解决方案的另一个项目中,我尝试以各种方式实现它(实际上这是我的app.config中的一个字符串)但它们都失败了(它确实可以在代码中显式创建类的早期绑定)。我也把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");

1 个答案:

答案 0 :(得分:2)

您需要指定完整的程序集限定名称。只有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