Activator.CreateInstance抛出异常“系统找不到指定的文件。”

时间:2014-07-03 09:31:26

标签: c# system.reflection createinstance

我复制了在解决方案中用于创建类似程序集的程序集的代码。 GUTS不同,但外壳保持不变。

这些程序集在客户端的项目中使用,这些项目是加载项,而不是我们的核心代码的一部分。现在我已经完成了程序集,不想像它应该的那样加载。

加载程序集的代码是

var assemblyName = ((XmlElement)xmlDoc.GetElementsByTagName("AssemblyName")[0]).InnerText;
var qualifiedClass = ((XmlElement)xmlDoc.GetElementsByTagName("QualifiedClass")[0]).InnerText;

IExternalAddOn addOn = (IExternalAddOn)Activator.CreateInstance(assemblyName, qualifiedClass).Unwrap();
var properties = new Dictionary<Type, object>();
properties[typeof(DevExpress.XtraBars.Ribbon.RibbonControl)] = mainForm.ribbon;
var form = addOn.ShowForm(properties);
if (form != null)
{
form.MdiParent = mainForm;
form.Text = pListRow.NAME;
form.Show();

我在CreateInstance部分获得了异常。

有趣的是,当我使用

Assembly ass = Assembly.LoadFrom(assemblyName); // this is test code
Type at = ass.GetType(qualifiedClass);
IExternalAddOn addOn = (IExternalAddOn)Activator.CreateInstance(at);

加载程序集并获取类型,然后运行CreateInstance。

为什么需要打开包装?两种不同的加载方式有区别吗?为什么第一个不起作用?

由于

Ĵ

1 个答案:

答案 0 :(得分:2)

只要Assembly.LoadFrom有效,我猜您将文件名作为assemblyName参数传递,这在Activator.CreateInstance(assemblyName, qualifiedClass)的情况下是错误的。

根据Activator.CreateInstance文件:

  

assemblyName可以是以下任一项:

     
      
  • 程序集的简单名称,没有路径或文件扩展名。例如,您可以为路径和名称为。\ bin \ TypeExtensions.dll的程序集指定TypeExtensions。

  •   
  • 已签名程序集的全名,包括其简单名称,版本,区域性和公钥令牌;例如,“TypeExtensions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 181869f2f7435b51”。

  •