Activator.CreateInstance会抛出异常

时间:2013-09-01 21:17:21

标签: c# reflection activator

我有这堂课:

public class PlaceLogicEventListener : ILogicEventListener
{

}

我有这个代码试图通过反射创建一个实例:

public ILogicEventListener GetOne(){
    Type type = typeof (PlaceLogicEventListener);
    return  (ILogicEventListener)Activator.CreateInstance(type.Assembly.Location, type.Name);
}

我收到以下异常:

System.TypeInitializationException : The type initializer for 'CrudApp.Tests.Database.DatabaseTestHelper' threw an exception.
  ----> System.IO.FileLoadException : Could not load file or assembly 'C:\\Users\\xxx\\AppData\\Local\\Temp\\vd2nxkle.z0h\\CrudApp.Tests\\assembly\\dl3\\5a08214b\\fe3c0188_57a7ce01\\CrudApp.BusinessLogic.dll' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)

我从测试dll调用GetOne()PlaceLogicEventListener和mothod GetOne()的代码都在同一个程序集中CrudApp.BusinessLogic.dll

3 个答案:

答案 0 :(得分:3)

这可能是因为您需要该类型的全名。

尝试:return (ILogicEventListener)Activator.CreateInstance(type.Assembly.Location, type.FullName);

同时检查此主题:The type initializer for 'MyClass' threw an exception

答案 1 :(得分:2)

您将type.Name作为参数传递,但PlaceLogicEventListener只有一个隐式无参数构造函数。

尝试:

Type type = typeof (PlaceLogicEventListener);
Activator.CreateInstance(type);

答案 2 :(得分:2)

你也传递了错误的组合名称 - 它需要显示名称。所以:

        Type type = typeof(PlaceLogicEventListener);
        var foo = (ILogicEventListener)Activator.CreateInstance(type.Assembly.FullName, type.FullName).Unwrap();

应该这样做,并解开从CreateInstance传回的ObjectHandle。