【问题标题】:Activator.CreateInstance throws Exception "The system cannot find the file specified."Activator.CreateInstance 抛出异常“系统找不到指定的文件。”
【发布时间】:2014-07-03 09:31:25
【问题描述】:

我已经复制了用于在解决方案中创建类似程序集的程序集的代码。 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 工作。

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

谢谢

J

【问题讨论】:

  • Unwrap 被调用是因为 the method 返回一个 ObjectHandle 而不是对对象的正常引用。不幸的是,我真的不明白为什么该方法被设计为返回ObjectHandle。我猜这是因为传递一个字符串名称本身并不会将类型元数据加载到内存中,所以你可以选择在你喜欢的时候这样做。

标签: c# system.reflection createinstance


【解决方案1】:

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

根据Activator.CreateInstance 文档:

assemblyName 可以是以下任意一种:

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

  • 已签名程序集的全名,由其简单名称、版本、文化和公钥令牌组成;例如,“TypeExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=181869f2f7435b51”。

【讨论】:

  • 谢谢,这就解释了。 UnWrap 在我使用Type 时如果没有它也能正常工作,或者它是否已经解开,因为我从Type CreateInstance 中得到CreateInstance
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2021-05-29
相关资源
最近更新 更多