【问题标题】:Excel 2010 64 bit can't create .net objectExcel 2010 64 位无法创建 .net 对象
【发布时间】:2011-02-13 00:59:42
【问题描述】:

我有一个在 Excel 中使用的简单类库。这是我的课程的简化...

using System;
using System.Runtime.InteropServices;

namespace SimpleLibrary
{
 [ComVisible(true)]
 public interface ISixGenerator
 {
  int Six();
 }

 public class SixGenerator : ISixGenerator
 {
  public int Six() 
  {
   return 6; 
  }
 }
}

在 Excel 2007 中,我将创建一个启用宏的工作簿并使用以下代码添加一个模块:

Public Function GetSix()
    Dim lib As SimpleLibrary.SixGenerator
    lib = New SimpleLibrary.SixGenerator
    Six = lib.Six
End Function

然后在 Excel 中,我可以调用函数 GetSix(),它会返回 6。这不再适用于 Excel 2010 64 位。我收到运行时错误“429”:ActiveX 组件无法创建对象。

我尝试将平台目标更改为 x64 而不是 Any CPU,但除非我取消选中 Register for COM interop 选项,否则我的代码将无法编译,这样做会导致我的宏启用工作簿无法看到 SimpleLibrary.dll 原样不再注册。

任何想法如何将我的库与 Excel 2010 64 位一起使用?

【问题讨论】:

  • 你的代码中没有原生依赖?您应该尝试解决您的代码无法编译为 x64 的问题。你到底得到了什么错误?
  • 您确实使用了 64 位版本的 regasm?它是否成功注册了程序集,即没有错误消息并且 HKCR 下的条目被创建?
  • 附注:即使有 64 位版本的 Office,Microsoft 还是建议使用 32 位版本,除非您需要大于 2gb 的 Excel 工作簿。 technet.microsoft.com/en-us/library/ee681792(office.14).aspx
  • 我注册了 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe。它注册得很好,但是当我在 VBA 中使用引用的程序集时,我得到“运行时错误:自动化错误。系统找不到指定的文件。”我使用了 ProcMon,它看起来在注册表中找不到路径。
  • Excel 试图访问哪个路径?您确定 Excel 确实作为 64 位应用程序运行(检查任务管理器或 Excel 的关于框)?否则我会尝试检查是否由于某种原因注册表重定向可能是一个问题:msdn.microsoft.com/en-gb/library/aa384232%28VS.85%29.aspx

标签: c# .net vba excel-2010


【解决方案1】:

您尚未详细描述如何创建 .NET 程序集。但是,将程序集公开给 COM 需要一定数量的步骤:

  • 将以下属性添加到您的代码中:

    using System;
    using System.Runtime.InteropServices;
    
    namespace SimpleLibrary
    {
        [ComVisible(true)]
        [Guid("71F645D0-AA78-4447-BA26-3A2443FDA691")]
        public interface ISixGenerator
        {
            int Six();
        }
    
        [ComVisible(true)]
        [ProgId("SimpleLibrary.SixGenerator")]
        [Guid("8D59E0F6-4AE3-4A6C-A4D9-DFE06EC5A514")]
        [ClassInterface(ClassInterfaceType.AutoDispatch)]
        public class SixGenerator : ISixGenerator
        {
            [DispId(1)]
            public int Six()
            {
                return 6;
            }
        }
    }        
    
  • 您的程序集必须签名(项目 -> 属性... -> 签名,创建一个强密钥文件并选中复选框以对程序集进行签名

  • 以下命令是注册程序集所必需的(全部在一行中):

    C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe 
                      SimpleLibrary.dll /tlb SimpleLibrary.tlb /codebase
    

    这将创建一个 .tlb 类型库文件,您必须从您的 VBA 项目中引用该文件(工具 -> 参考 -> 浏览... 在您的 VBA 编辑器中)

  • 调整VBA代码:

    Public Function GetSix()
        Dim lib As SimpleLibrary.SixGenerator
        Set lib = New SimpleLibrary.SixGenerator
        GetSix = lib.Six
    End Function
    

您将在这篇关于 Microsoft 支持数据库的文章中找到更详细描述的步骤:

How to call a Visual Basic .NET or Visual Basic 2005 assembly from Visual Basic 6.0

【讨论】:

  • 谢谢,这使我可以将我的加载项与 Excel 2010 64 位一起使用。我想在任何版本的 Excel 中使用这个加载项。我可能要求太多,但这可能吗?
  • 经过两周的折磨,这是天赐之物。带有 COM 互操作程序集的 64 位 Excel 2013 是一场噩梦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多