我有这堂课:
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
答案 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。