我的公司发布了一个产品,其中包括在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?
答案 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中完成。我不确定究竟是什么原因,但可能需要对代码安全性做些什么。