在另一个程序集中创建 WebPart 子类时出错

Posted

技术标签:

【中文标题】在另一个程序集中创建 WebPart 子类时出错【英文标题】:Errors creating WebPart subclass in another assembly 【发布时间】:2010-09-09 07:25:44 【问题描述】:

我正在尝试创建一个 WebPart 的子类,它将作为我们创建的任何 WebPart 的父类。如果我在同一个项目中创建一个空类,我可以像预期的那样继承它。但是,如果我尝试将它放在另一个程序集中——我已经能够引用和使用其中的类——我会收到以下错误:

无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

其他可能相关的信息(我通常不是 SharePoint 开发人员):我编译 dll,从开发项目中引用它们,然后将它们复制到 SharePoint 实例的 /bin 目录中。程序集均已签名。我正在尝试使用 VS2008 的“部署”功能进行部署。

很遗憾,这似乎不是特定于 SharePoint 的错误,我不确定如何解决该问题。有没有人遇到过这种情况,您有什么建议吗?

【问题讨论】:

【参考方案1】:

好的,我发现了问题。打包任务出于某种原因使用反射。当它发现你的类继承自另一个域中的类时,它会尝试使用反射加载它。但是,反射不执行绑定策略,因此不会加载域。

打包程序的作者可以通过添加以下代码来解决这个问题:

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);

static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);

但是,如果您的项目需要解决方案,只需将程序集添加到 GAC 即可解决。

【讨论】:

以上是关于在另一个程序集中创建 WebPart 子类时出错的主要内容,如果未能解决你的问题,请参考以下文章

单击事件上的 Kentico 自定义 WebPart 按钮

在sharepoint server 2010中激活.wsp文件时出错

当子类不在同一个程序集中时如何在protobuf中列出继承

在另一个命名空间中自动加载命名空间时出错

从 BrowserWindow 电子类扩展时出错

反序列化具有在 AssemblyResolve 上加载的其他程序集中声明的类型字段的对象时出错