如何收回不可收回的解决方案
-
10-12-2019 - |
题
看起来我在使用示例共享点项目进行一些测试时犯了一个相当大的错误。具有讽刺意味的是,我试图构建一个可单元测试的解决方案,而没有先编写许多测试。我对 SharePoint 还很陌生,想探索一下我能/不能用 SP 和 IoC 做什么。
因此,在不讨论太多细节的情况下,我不小心编写了一些递归代码,最终抛出了 StackOverflowException。没什么大不了的,对吧?只需收回溶液并将其移除即可。问题是在解决方案功能期间会调用此代码 FeatureUninstalling
方法在一个 SPFeatureReceiver
.
(嗯,不完全是。该代码最终在 SPFeatureReceiver
的静态构造函数。如果您想知道为什么,我尝试使用 Castle Windsor 组成根,以便注入可在 FeatureInstalling 和 FeatureUninstalling 方法期间使用的依赖项。)
因此,尝试使用中央 Web 管理或 Uninstall-SPSolution 时会发生什么:
- 计划进行一项工作来撤回该解决方案。
- 该作业执行并尝试撤回解决方案。
- 该作业构造一个新的 SPFeatureReceiver 以调用 FeatureUninstalling。
- SPFeatureReceiver(静态)构造函数调用尝试组成根的代码,并在其中最终抛出 StackOverflowException。
- 我收到一条弹出消息,指示 OWSTIMER.exe 遇到异常,并询问我是否要调试。
- OWSTIMER.exe 重新启动并循环回到步骤 #2。
因此问题是:如何收回无法收回的解决方案?
解决方案
您是否尝试过注释掉有问题的代码,重建/重新打包,然后运行 Update-SPSolution
命令?
这 FeatureUninstalling
事件发生在删除时,并且,我相信,升级时不会调用它(这就是 FeatureUpgrading
活动是为了)。
如果您可以成功升级并替换有问题的代码,那么您就可以安全地删除该解决方案。
再想一想,我上面的建议是行不通的,因为如果这个异常发生在构造函数中,而不是事件中,显然无论解决方案修改方法如何(升级与升级),它仍然会被调用。卸载)。不过,您可以在删除有问题的代码后手动替换 GAC 中的 .dll,然后尝试撤回。
其他提示
我也有类似的想法 @RJ Cuthbertson 的回答 关于 GAC,但它不允许我从那里卸载任何内容。 直到我发现这个:
重要的!切勿在生产系统上执行此操作,并始终在之后重新打开它。
打开本地安全策略 MMC
转到安全设置 -> 本地策略 -> 安全选项
找到“用户帐户控制:在“管理员批准”中运行所有管理员并将设置从“启用”更改为“禁用”
重新启动,现在可以删除程序集。
按照上述步骤重新启用本地安全策略设置并再次重新启动以重新应用它。
在上面的第 4 步之后,我能够从 GAC 中删除 Castle.Windsor.dll,之后,撤消/卸载/删除全部工作。