0

我已经复制了用于在解决方案中创建类似程序集的程序集的代码。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?两种不同的加载方式有区别吗?为什么第一个不起作用?

谢谢

Ĵ

4

1 回答 1

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”。

于 2014-07-03T09:41:21.097 回答