【问题标题】:Excel .NET COM - Automation error. The system cannot find the file specifiedExcel .NET COM - 自动化错误。该系统找不到指定的文件
【发布时间】:2010-10-27 06:35:33
【问题描述】:

我有一个 VBA 在 Excel 中使用的 .NET 2.0 COM 对象。它在我的开发机器上运行良好,但是当尝试在干净的 VM 工作站上使用它时,我收到此错误:

自动化错误。 系统找不到指定的文件。

该 dll 使用“regasm /tlb /codebase mycom.dll”注册,并且未放入 GAC。 我没有虚拟机框的管理权限

有什么想法吗?

【问题讨论】:

  • 您的 COM 是正确的平台吗? 我制作了自己的 .dll,以便在 Excel VBA 中使用。我得到了这个确切的消息,因为我为 x64 而不是 x86 编译它。

标签: .net excel com automation


【解决方案1】:

您需要调用 regasm 并将程序集的完整路径作为 codebase 参数值,或者将程序集放在某个位置,该位置始终位于搜索库的路径上。否则客户端尝试实例化 COM 对象时将找不到。

【讨论】:

  • 我确实尝试在位于 c:\temp 的程序集的完整路径上使用 regasm,但仍然出现相同的错误
  • 那么我想你最好的办法是启动 ProcessMonitor - technet.microsoft.com/ru-ru/sysinternals/bb896645.aspx - 看看究竟是什么文件没有找到。它可能是您完全不知道的一些依赖程序集。一旦你确定它会更容易解决。
  • 尖牙,非常感谢您非常的回答。今天它救了我的皮!
【解决方案2】:

在 Windows 7、64 位和 .NET 4.0 框架 dll(32 位)上,我希望可用作 Microsoft Excel 2010 VBA 应用程序的 COM 对象,这对我有用。

  1. 将 dll 复制到 c:\windows\syswow64
  2. 在 cmd shell 中,运行

    C:\Windows\Microsoft.NET\Framework\v4.0.<whatever you have>\regasm.exe c:\windows\syswow64\<name of dll> /codebase /tlb:c:\windows\syswow64\<name of dll minus '.dll'>.tlb
    

如果您不想或不需要在您注册程序集的机器上进行智能感知,您可以跳过最后一部分 (/tlb:. . .)。

我遇到的关键问题是,在 XP 上我以前从未使用过 /codebase 参数,但这是在此工作之前需要的关键。

【讨论】:

    【解决方案3】:

    我在创建 .NET .dll (v4.0) 并打算在 VB6 应用程序中使用它后收到此“自动化错误。系统找不到指定的文件”错误(用“ClassInterface”装饰我的类" 和 "ComVisible" 属性,带有 "ComVisible" 的方法)。

    我运行“regasm.exe -tlb C:\PathTo\MyDll.dll”,但在我的 VB6 应用程序中添加 .tlb 文件作为参考并运行/调试它后收到上述错误。只有在 regasm.exe 调用中添加“-codebase”参数并重新添加 .tlb 引用后,错误才得到解决。

    只是想我会分享我的经验。

    【讨论】:

      【解决方案4】:

      我还收到一个自动化错误。我的参考(在 MS Access 中)是 TLB 文件。保存 TLB 文件的文件夹中缺少相应的 DLL 文件,这导致出现“自动化错误”消息。将DLL重新添加到fixed中。

      【讨论】:

        【解决方案5】:

        我遇到了同样的错误(在我最初编写它的第一台机器上工作之后,无法在第二台开发机器上使用来自旧版 VB6 cod 的 .NET 对象)。 .NET DLL 编译和注册得很好——我尝试了各种组合——在 VS 中使用和不使用“Register for COM Interop”构建设置;通过 regasm.exe 手动注册并尝试使用 /codebase 参数;尝试启用和抑制 COM Visible 程序集级属性(抑制时,我在需要从 COM 使用的类上设置属性)。但是没有任何效果,我一直收到同样的错误。

        原来我已经在第二台机器上将 DLL 输出升级到 .NET 4.5,而它最初是在构建一个 .NET 2.0 程序集。我的项目有一些针对运行 .NET 2.0 的第三方互操作 DLL 的引用。当我更新这些引用并重建 DLL 或将我的项目重新设置为在 .NET 2.0 上运行时,我的问题就解决了。当使用 /codebase(VS 自动执行)时,我发现我不需要将我的 DLL 放在应用程序目录或 \syswow64 中。此外,MSDN 文档声明您在使用 /codebase 时必须为您的程序集使用 SN(强名称),但我发现您不必这样做;您只会从 regasm.exe 命令行工具收到警告。

        关键是,从 COM 互操作的角度来看,请注意您的依赖项的 .NET 运行时版本与您所针对的 .NET Framework 相关。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-08
          相关资源
          最近更新 更多