【问题标题】:Does a SharePoint EventReceiver have to be installed in the GAC, and if so do all dependent assemblies have to as well?是否必须在 GAC 中安装 SharePoint EventReceiver,如果是,所有相关程序集也必须安装吗?
【发布时间】:2011-01-07 00:32:53
【问题描述】:

我的公司发布了一种产品,其中包括在 SPLists 上注册 SharePoint EventReceiver,监视更改。我一直在 GAC 中注册它,它运行得很好。但是,我们的一位客户对我们在 GAC 中安装的程序集表示不满意,并希望我们将二进制文件移动到 SharePoint BIN 目录并执行该方案所需的其他安全/信任巫术。

当我尝试注册一个不在 GAC 中的事件接收器时,我得到一个非常具体的异常,其消息显示:“事件接收器程序集不在 GAC 中。”我将此解释为 SharePoint 要求在 GAC 中安装事件接收器。此外,我在 MSDN 上找到了这个:http://msdn.microsoft.com/en-us/library/ff407965.aspx:“事件接收器和处理事件”部分状态

SharePoint Foundation 事件处理程序 是自定义的编译模块 其调用为的托管代码 由指定的事件触发 你已经指定了。事件处理程序代码 编译成 .dll 文件并 部署到 GAC。

这再次暗示但不完全说明 GAC 安装是一项要求。有人确切地知道这个问题的答案,所以我可以回到客户那里解释我们的 GAC 要求吗?

现在的后续问题是:如果我在 GAC 中有一个程序集,并且我“静态链接”到其他程序集——即我没有使用 Assembly.Load() 显式动态加载它们——那么那些其他程序集还必须居住在 GAC 中吗?

【问题讨论】:

  • 只能笑着说“...我们的一个客户对我们在 GAC 中安装的程序集表示不满意...”我想不出一个人会不高兴的正当理由程序集在 GAC 中。这不是比在文件系统中需要“安全/信任巫毒”更好吗?
  • 是的,当我们看到这个要求时,我们自己都有些不知所措。我正在寻找可以提供给他们的任何证据,让他们重新考虑他们的非 GAC 政策。

标签: .net sharepoint


【解决方案1】:

事件接收器程序集不能仅安装在“bin”中,因为这样 .net 框架无法找到它们。

当您的程序集从“b​​in”加载时,这是因为程序集加载器使用探测来定位程序集。首先它在 GAC 中查找,然后在当前工作目录下查找名为“bin”的目录。

因此,您用于运行 Web 界面的所有代码(用于 ASPX 页面、Web 服务等的代码隐藏)都可以放在 inetpub..../bin 中,因为您的 Web 应用程序的工作目录就在那里。

但是,工作流和计划的“计时器作业”由 Windows 服务 OWSTIMER.exe 执行。作为典型的 Windows 服务,它的工作目录位于 c:\windows 中。

这意味着,如果您将程序集放在 inetpub...\bin 中的某个位置,owstimer 将找不到它。

因此,必须将事件处理程序等共享程序集部署到 GAC。

【讨论】:

  • 谢谢,这是有道理的。让我们将程序集放在 c:\windows 下,我的客户可能不会那么兴奋。
【解决方案2】:

无法在 Bin 中部署 SharePoint EventReceiver。它只能在 GAC 中完成。我不确定确切的原因是什么,但可能与代码安全有关。

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多