2012-09-07 80 views
8

我想在运行时加载程序集,但我不确定为什么我不能在程序集中使用静态方法创建类型的实例Activator.CreateInstance()。它适用于Assembly.CreateInstance()在运行时加载程序集并使用Activator.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程序' 或一个它的 依赖IES。该系统找不到指定的文件。

编辑:

在这两种情况下,Assembly.LoadFrom()电话后,我可以看到,当我看着我的AppDomain.CurrentDomain.GetAssemblies()组件已经加载。

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

编辑:

+1

第二个版本应该指定一个完整的程序集名称,而不仅仅是显示名称,并使用Assembly.Load()。与LoadFrom()不同。使用fuslogvw.exe排除故障 –

+0

正如“MyAssembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 5dc3e20777fed081”一样?我得到了同样的错误 – davenewza

+0

我甚至直接从GetAssemblies()中的“MyAssembly”复制了FullName,并且它仍然不起作用。如此迷茫! – davenewza

回答

2

你必须向大会第一次加载到当前的AppDomain调整你的文件工作的呢?

Form form = (Form)Activator.CreateInstance(Type.GetType(typeName)) 
+0

我得到同样的问题。如果我在'Assembly.LoadFrom()'后面查看'AppDomain.CurrentDomain.GetAssemblies()',那么我可以看到我的程序集已经加载了这两种情况。 – davenewza

+1

@davenewza检查我的编辑,看看是否有效 –

+0

它没有。 'Type.GetType()'得到“Value can not be null”。 – davenewza

3

你可以用自己的路径

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

var TypeName = ""; 
Type type = thisAssembly.GetType(TypeName); 
object instance = Activator.CreateInstance(type); 
+0

我需要使用Activator.CreateInstance(),因为我不总是有可用的程序集实例。 – davenewza

+1

@davenewza我添加代码发帖 –

1

试图编辑原始答案,但我没有得到作者的回应。所以,万一有人需要这个,这里是我

System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH")); 
Form form = (Form)assembly.CreateInstance("FullNameSpace.ClassName"); 
0

工作代码中的Khudairy的答案在这里,让路过的输入参数访问特定的构造,再加上他的回答这种变化的一个变化解析这个问题我一直在寻找和解决的问题,现在正在努力解决(为了分享答案,他为此付出了很多荣誉)。

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

试图与loadFromRemoteSources和useLegacyV2RuntimeActivationPolicy运行NetFx40_LegacySecurityPolicy的组合,并尝试几种不同的方法,如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); 

...从中根据需要(我的基类)晚些时候推出它在它自己的表/窗口,我可以在以后投的对象。

相关问题