【问题标题】:Uninstalling my Office 2010 plugin leaves a null pointer exception卸载我的 Office 2010 插件会留下空指针异常
【发布时间】:2011-07-31 11:45:08
【问题描述】:

我一直在试图找出为什么我的 Office2010 插件在卸载过程中会留下空指针异常,而 2007 版不会。 (编辑:2007 年与 2010 年处于相同状态 - 失败)

为了缩小范围,我设置了几个事件日志陷阱,这意味着如果代码达到这一点 - 我应该在事件日志中得到一些东西。没有这样的运气。现在要么我写错了事件日志陷阱,要么代码没有达到那个点。

在 CustomSetupActions - ClickOnceInstaller.cs

    public void Uninstall(System.Collections.IDictionary savedState)  
    {  
        // write something to eventlog  
        // This is not being fired, the exception doesn't reach here or writing to eventlog fails.  
        if (!EventLog.SourceExists("OfficePlugin"))  
        {  
            EventLog.CreateEventSource("OfficePlugin", "Application");  
        }  
        EventLog.WriteEntry  
            ("OfficePlugin"  
            , string.Format("Uninstalling: (bug hunting)"), EventLogEntryType.Information);

        string deploymentLocation = (string)savedState["deploymentLocation"];
        if (deploymentLocation != null)
        {
            string arguments = String.Format(
                "/S /U \"{0}\"", deploymentLocation);
            ExecuteVSTOInstaller(arguments);
        }
    }

至于ExecuteVSTOInstaller(string arguments)

2007 指:string subPath = @"Microsoft Shared\VSTO\9.0\VSTOInstaller.exe";
2010指:string subPath = @"Microsoft Shared\VSTO\10.0\VSTOInstaller.exe";

如果第一个陷阱已经开火,那么这就是我之后放置陷阱的地方。

--

我有另一种处理注册数据库的方法

RegisterOffice2010AddIn.cs

    public void UnRegisterAddIn(string applicationName, string addInName)
    {

下一行与我刚刚使用/显示的事件日志陷阱完全相同。

两者之间的差异(2007 年与 2010 年)。

    private const string UserSettingsLocation =
        @"Software\Microsoft\Office\12.0\User Settings";

对

    private const string UserSettingsLocation =
        @"Software\Microsoft\Office\14.0\User Settings";

我想不出任何其他可能有趣的地方来放置陷阱。我有一个 CustomInstaller,除了 Dispose(bool disposing) 和 InitializeComponent() 之外什么都不做

发展:

动作开始时间 14:21:00:PublishFeatures。
操作于 14:21:00 结束:PublishFeatures。返回值 1.
行动开始时间 14:21:00:PublishProduct.
行动于 14:21:00 结束:发布产品。返回值 1.
动作开始时间 14:21:00:InstallExecute。
MSI (c) (B8:BC) [14:21:01:013]:字体已创建。字符集:Req=0,Ret=0,字体:Req=MS Shell Dlg,Ret=MS Shell Dlg

错误 1001。错误 1001。卸载时发生异常。此异常将被忽略,卸载将继续。但是,卸载完成后,应用程序可能不会完全卸载。 --> 对象引用未设置为对象的实例。
调试:错误 2769:自定义操作 _EE8A0D36_BE55_421F_9A55_95470C001D87.uninstall 未关闭 1 个 MSIHANDLE。
安装程序在安装此软件包时遇到意外错误。这可能表明此软件包有问题。错误代码为 2769。参数为:_EE8A0D36_BE55_421F_9A55_95470C001D87.uninstall, 1,
操作于 14:21:05 结束:InstallExecute。返回值 3.
行动于 14:21:06 结束:安装。返回值 3。

谷歌搜索错误 2769 - 给出“[TARGETDIR]\”的答案,但我没有引用 TargetDir,我引用了 deploymentLocation。是的,我尝试将“\”添加到我能想到的地方。包括设置 - 注册表 - HKLM\Software\MS\Office\12.0\ ...etc... \Addins\Excel/Word/Outlook 和 Manifest 键值。没有反馈,无论好坏,错误或其他。我不知道还有什么可以尝试追捕这个。

我猜它在 VDPROJ 中引用了这个:

{
"名称" = "8:UnregisterOutlookAddIn"
"条件" = "8:"
"对象" = "8:_73E71A44EB72485AB7367745F7D57F49"
"文件类型" = "3:1"
"InstallAction" = "3:4"
"参数" = "8:"
“入口点”=“8:”
“序列” = “3:3”
“标识符”=“8:_EE8A0D36_BE55_421F_9A55_95470C001D87”
"InstallerClass" = "11:TRUE"
"CustomActionData" = "8:/addinName=\"OUR.Outlook.Outlook2010AddIn\" /application=\"Outlook\""
}

我发现它引发了两个异常 - CustomSetupActions 和 UnregisterAddIn 下的次要异常和 ClickOnceInstaller 和 Uninstall 下的主要异常。为什么我将它们称为二级和初级。好吧,它将在 CustomAction 中执行异常,然后在 ClickOnce 中杀死异常。我已经消除了 CustomActions 中的那个,现在我只需要担心 ClickOnce。据我所知,ClickOnce 实现了安装项目中指定的接口(安装、回滚、提交、卸载)。我只需要弄清楚它是如何运行错误的卸载方法的。

免责声明:当然,除非我弄错了,是在找错树。

【问题讨论】:

  • 当然,在自定义操作的安装项目中,我已经排除了不同的卸载方法来尝试缩小范围。查看异常的来源。没有这样的运气。
  • 我已经通过互联网和谷歌搜索了几次,发现了一些 Windows Update 没有找到的补丁/更新。没有运气。要么我已经有了更新/补丁,要么它们默认不包含在 Windows 更新中(不太可能)。在安装过程中,我又扔了几个陷阱。安装以某种方式完成安装,通过陷阱而不触发它们。是的,我重新编译和设置,msi 有一个全新的时间戳。
  • 我发现我的自定义安装程序为 - link(或多或少是精确的复制粘贴)。我仍在尝试找到一种方法,以便我可以准确地看到留下空引用的部分。
  • 错误 1001。卸载时出现异常。此异常将被忽略,卸载将继续。但是,卸载完成后应用程序可能没有完全卸载 --> 对象引用未设置为对象的实例。
  • 我的解决方案还是直接复制粘贴官方推荐和代码。 msdn link

标签: c# plugins ms-office uninstallation


【解决方案1】:

更改为 WiX。它成为一种解决方法,因为原来的仍然是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2015-11-14
    • 2015-09-04
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多