在运行时加载程序集并使用Activator.CreateInstance()创建实例

Dav*_*New 12 .net c# reflection

我试图在运行时加载程序集,我不确定为什么我不能使用静态在程序集中创建类型的实例Activator.CreateInstance().它适用于Assembly.CreateInstance().

string assemblyFilename = "MyAssembly.dll";
string assemblyName = "MyAssembly";
string typeName = "MyAssembly.MyType";

FileInfo fileInfo = new FileInfo(assemblyFilename);
Run Code Online (Sandbox Code Playgroud)

这有效:

var assembly = Assembly.LoadFrom(assemblyFilename);
Form form = (Form)assembly.CreateInstance(typeName);
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

Assembly.LoadFrom(assemblyFilename);
Form form = (Form)Activator.CreateInstance(assemblyName, typeName).Unwrap();
Run Code Online (Sandbox Code Playgroud)

抛出FileNotFoundException:

无法加载文件或程序集"MyAssembly"或其依赖项之一.该系统找不到指定的文件.

编辑:

在这两种情况下,在Assembly.LoadFrom()调用之后,我可以看到当我查看时我的程序集已被加载AppDomain.CurrentDomain.GetAssemblies().

Agh*_*oub 5

您可以使用他的路径调整文件

var path = Assembly.GetAssembly(MyType.GetType()).Location;
var thisAssembly= Assembly.LoadFrom(path);

var TypeName = "";
Type type = thisAssembly.GetType(TypeName);
object instance = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)


arm*_*oon 4

您必须首先将程序集加载到当前的 AppDomain 中:

AppDomain.CurrentDomain.Load(File.ReadAllBytes(assemblyFileName));
Run Code Online (Sandbox Code Playgroud)

编辑:这有效吗?

Form form = (Form)Activator.CreateInstance(Type.GetType(typeName))
Run Code Online (Sandbox Code Playgroud)