2010-04-27 37 views
4

我有一個簡單的類庫,我在Excel中使用。這裏是我的類的簡化...Excel 2010 64位不能創建.net對象

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(),它將返回六。這不再適用於Excel 2010 64位。我得到一個運行時錯誤'429':ActiveX組件不能創建對象。

我試着將平臺目標改爲x64而不是任何CPU,但是之後我的代碼無法編譯,除非我取消選中Register for COM interop選項,這樣做使得我的宏啓用工作簿無法看到SimpleLibrary.dll。不再註冊。

任何想法如何使用我的圖書館與Excel 2010 64位?

+0

而你的代碼中沒有本地依賴項?您應該嘗試解決您的代碼無法編譯爲x64的問題。你究竟得到了什麼錯誤? – 2010-04-27 19:36:45

+0

當我將我的平臺目標設置爲x64並選擇註冊COM互操作時,我會得到「文件XXX不是有效的程序集」。此錯誤已被報告(http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/253110bc-5fee-478f-a2eb-e1d5ec6039af)但修復程序是手動註冊。當我這樣做時,我的宏啓用工作簿仍然無法看到該DLL。 – 2010-04-27 19:45:39

+1

而你確實使用了64位版本的regasm?它是否成功註冊程序集,即沒有錯誤消息和HKCR下的條目被創建? – 2010-04-27 19:52:13

回答

3

你沒有詳細描述你的.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 
    

你會發現在微軟的支持數據庫在這篇文章中詳細描述的步驟:

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

+0

謝謝,這使我可以使用我的Excel 2010 64位加載項。我想在任何版本的Excel中使用此加載項。我可能會問很多,但這可能嗎? – 2010-04-28 15:12:04

+0

經過兩週的折磨,這是天賜之物。帶有COM互操作程序集的64位Excel 2013是一場噩夢。 – 2015-01-29 18:55:44