14

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

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

FileInfo fileInfo = new FileInfo(assemblyFilename);

这有效:

var assembly = Assembly.LoadFrom(assemblyFilename);
Form form = (Form)assembly.CreateInstance(typeName);

但这不起作用:

Assembly.LoadFrom(assemblyFilename);
Form form = (Form)Activator.CreateInstance(assemblyName, typeName).Unwrap();

抛出 FileNotFoundException:

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

编辑:

在这两种情况下,在Assembly.LoadFrom()调用之后,当我查看AppDomain.CurrentDomain.GetAssemblies().

4

4 回答 4

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);
于 2012-09-07T11:55:48.137 回答
4

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

AppDomain.CurrentDomain.Load(File.ReadAllBytes(assemblyFileName));

编辑:这行得通吗?

Form form = (Form)Activator.CreateInstance(Type.GetType(typeName))
于 2012-09-07T11:56:06.230 回答
2

试图编辑原始答案,但我没有收到作者的回复。因此,以防万一有人需要,这是对我有用的代码

System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH"));  
Form form = (Form)assembly.CreateInstance("FullNameSpace.ClassName");
于 2014-11-16T10:29:16.883 回答
0

A Khudairy 的答案的变体在这里允许传入输入参数以访问特定的构造函数,再加上他的答案的变体解决了一个问题,我已经遇到了一个问题,实际上我已经断断续续地搜索了几个星期,现在试图解决(很多荣誉给他分享答案)。

我的问题是我想将 .NET 3.5 dll 加载到 .NET 4.6 的新应用程序中,但那些旧 dll 使用了看起来使用 CAS 策略的第三方控件。我会从第三方控件收到一个错误,说我需要上交 app.config,如果我这样做了,我可以加载和运行这些文件,如果它们在我的本地计算机上,但如果我尝试从一个网络驱动器,我需要这样做,然后我收到 FileIOPermission 错误。

尝试运行 NetFx40_LegacySecurityPolicy 与 loadFromRemoteSources 和 useLegacyV2RuntimeActivationPolicy 的组合,并尝试了几种不同的方法,例如通常对我有用的 Activator.CreateInstance(),尝试创建沙箱(尽管我不知道我是否做得正确),但没有任何效果,以下除外。请注意,我的用户控件也是基于基类的。在授予对网络驱动器的访问权限之前,我已经运行了一些 CAS 命令提示符命令,并且我的应用程序应该在完全信任的情况下运行。无论如何,到目前为止,除了这个之外,我尝试过的任何方法看起来都没有对我有用。

代码修复:

object dllUserControl = null;
System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH"));  
dllUserControl = assembly.CreateInstance("FullNameSpace.ClassName",true,BindingFlags.Default,null,constructorParams[],null,null);

...我可以稍后根据需要将对象转换为我的基类,以便稍后在它自己的窗体/窗口中启动它。

于 2018-03-06T23:37:46.110 回答