是否必须在GAC中安装SharePoint事件接收器,如果是这样,所有依赖程序集也必须安装?

时间:2011-01-07 00:32:54

标签: .net sharepoint

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

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

  

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

这再次暗示但并未完全声明GAC安装是必需的。有人确实知道答案,所以我可以回到客户那里解释我们的GAC要求吗?

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

2 个答案:

答案 0 :(得分:11)

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

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

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

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

这意味着,如果你把你的程序集放在inetpub ... \ bin中的某个地方,那么owstimer就找不到它。

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

答案 1 :(得分:0)

在Bin中无法部署SharePoint EventReceiver。它必须仅在GAC中完成。我不确定究竟是什么原因,但可能需要对代码安全性做些什么。