【问题标题】:A end product user can't create an excel interop instance最终产品用户无法创建 Excel 互操作实例
【发布时间】:2020-03-04 09:05:45
【问题描述】:

我正在为内部部署创建一个 wpf 应用程序。

使用该软件的用户在尝试创建 Excel 互操作实例时遇到以下错误。

Retrieving the COM class factory for component with CLSID (...) failed due to the following error: 80070002 The system cannot find the file specified

捕获错误的部分如下

try
{
    _excelApplication = new Microsoft.Office.Interop.Excel.Application();
    GetWindowThreadProcessId(_excelApplication.Hwnd, out ExcelAppProcessId);
    _excelApplication.ScreenUpdating = false;
}
catch(Exception e)
{
    //TODO Move message box to parents
    MessageBox.Show($"Termination Error: Could not open Excel Application: {e.Message}");

    Environment.Exit(110);
}

以前同一用户在尝试打开 Access 时遇到问题(不记得确切的错误是什么),我实施了以下方法来修复它。

try
{
    //MessageBox.Show($"OS: {EnvironmentFunctions.is64BitOperatingSystem} Process: {EnvironmentFunctions.is64BitProcess}");

    if (EnvironmentFunctions.is64BitOperatingSystem && !EnvironmentFunctions.is64BitProcess)
    {
        string PathValue = "";
        string sAdd = "";
        string strCommonFiles =
            Environment.GetEnvironmentVariable("CommonProgramFiles(x86)");

        sAdd = ";" + strCommonFiles + "\\microsoft shared\\DAO";
        PathValue = Environment.GetEnvironmentVariable("Path");
        PathValue += sAdd;

        Environment.SetEnvironmentVariable("path", PathValue);

    }

    _accessApplication = new Microsoft.Office.Interop.Access.Application();
    GetWindowThreadProcessId(_accessApplication.hWndAccessApp(), out AccessAppProcessId);
}
catch
{
    MessageBox.Show("Termination Error: Could not open Access Application");
    Environment.Exit(110);
}

除了 Excel 互操作之外,是否会有类似的解决方案?

关于用户的注意事项:它们是为数不多的正在运行的 Windows 7 之一。

【问题讨论】:

  • Office COM 互操作已过时,不应再使用。它具有 COM 互操作的所有常见问题。还有一堆它自己的,包括但不限于: 1. 它需要一个交互式会话。对于桌面应用程序来说不是问题,但对于服务和作为/在服务中运行的任何东西(如 Web 应用程序)来说是一个严重的问题 (docs.microsoft.com/en-us/windows/win32/services/…)。 2.它需要在它运行的计算机上安装office。因为它所做的只是远程处理一个 office 实例。
  • 只有部分相关,但异常处理是我的一个小烦恼,而你的则很糟糕。您捕获异常-这是一种广泛的方式-并且仅公开或记录消息-如果有的话。这是我经常链接的两篇文章:blogs.msdn.microsoft.com/ericlippert/2008/09/10/… | codeproject.com/Articles/9538/…
  • “Office COM 互操作”是否与“Microsoft.Office.Interop.Excel”(或子集)相同?我很确定 Office 已安装在他们的计算机上(他们打开并使用 Office 应用程序),但我会仔细检查以确保它没有安装在与本地硬盘驱动器不同的目录中。
  • @Mandelbrotter 是的,“Microsoft.Office.Interop”是 Office COM 互操作。 |关于找不到文件:IIRC,您必须使用 COM 注册组件,而过于现代的 Office 版本可能不会这样做。 |这也可能是一个权利问题。 | COM 失败的原因有很多,这是我们转向 .NET 的重要原因之一 :)
  • 找到了一些旧的解决方案: 1. 将 COM 互操作调用放入一个具有固定二进制性的辅助进程中,您的主进程可以通过任何 IPC 方法与之对话。 (social.msdn.microsoft.com/Forums/vstudio/en-US/…) 2. 正在围绕 DLL 导入(复数)(codeproject.com/Tips/852544/NET-Interop-with-and-bit-DLLs) 进行包装。 |当然,我的建议仍然是使用 OpenXML SDK,但我认为其中一个“老板”想使用一些专横的旧格式?

标签: c# excel com interop file-not-found


【解决方案1】:

检索具有 CLSID (...) 的组件的 COM 类工厂失败,原因是以下错误:80070002 系统找不到指定的文件

通常,此错误仅由几个问题引起,我将在下面列出。

  1. 最近的 Windows 更新
  2. 分区问题和/或问题
  3. 位数问题(确定最终计算机上安装了什么 Office 以及编译应用程序的对象)

我之前问过您的目标是什么,因为您有一些代码正在检查 pc 是否为 64 位,并且您已经遇到了一些问题。这导致我在创建 Excel 实例时遇到了一些问题。

我对您的确切问题的建议和解决方案是因为终端机器是 32 位的,所以为 x86/32 位编译应该可以解决问题。

最后一点,您可以删除旧代码,因为它不再需要了。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多