我复制了在解决方案中用于创建类似程序集的程序集的代码。 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。
为什么需要打开包装?两种不同的加载方式有区别吗?为什么第一个不起作用?
由于
Ĵ
答案 0 :(得分:2)
只要Assembly.LoadFrom
有效,我猜您将文件名作为assemblyName
参数传递,这在Activator.CreateInstance(assemblyName, qualifiedClass)
的情况下是错误的。
assemblyName可以是以下任一项:
程序集的简单名称,没有路径或文件扩展名。例如,您可以为路径和名称为。\ bin \ TypeExtensions.dll的程序集指定TypeExtensions。
已签名程序集的全名,包括其简单名称,版本,区域性和公钥令牌;例如,“TypeExtensions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 181869f2f7435b51”。