none
請教關於 Visual Studio 2008 開發類別庫(.dll)後, 註冊成tlb給VBA使用時發生 429 Error 的解決方法 RRS feed

  • 問題

  • 有個問題希望得到各位先進的指導, 爬文註冊了頗多有關"Error 429 ActiveX 元件無法建立物件"的 dll ocx 都無法解決....

    近日客戶因有安全性需求希望我的程式能使用Visual Studio 2008開發類別庫(.NET Framework)

    以 COM Interop 物件包成DLL交案,因之前沒接觸過DLL撰寫, 故先寫個簡單的加法FUNCTION在類別庫中建置

    Public Class Class1
        Public Function addtest(ByVal i As Integer, ByVal j As Integer) As String
            Dim total As Integer = i + j
            Return total.ToString()
        End Function

    End Class

    建置好後得到一個dll File使用 Regasm “DLL路徑” /tlb:”tlb路徑” /codebase 進行註冊得到tlb, 回饋的訊息是顯示成功註冊

    接著VBA中先手動引用這個tlb, 無錯誤訊息, 但在呼叫class1的加法Function時出現 Error 429, 不論我使用New或是CreateObject都無法順利建立物件

    Sub test()
    Dim testcalss As New Class1
    Range("A1").Value = testcalss.addtest(1, 1)
    End Sub

    我使用另一台電腦的Visual Studio 2015做同樣的Function, 但在編譯有勾註冊COM Interop”

    有勾所做出來的DLL是在本機的VBA引用是成功且呼叫Function不會有錯誤, 但檔案拿到另一台電腦以同樣手法註冊後就會出現Error 429…

    在網路上找了一些解決方法(pdwezard.ocxhostwiz.dll…)都無法解決此問題

    我的作業系統: Windows 7 - 64位元

    Office 系統: Microsoft Office 2007 - 64 位元

    希望對此狀況有所了解的專家們能指導一二, 十分感謝






    • 已編輯 HSWayne 2016年7月14日 上午 09:43
    2016年7月14日 上午 04:00

解答

  • VS2008 編譯時是 x86 還是 any cpu

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 HSWayne 2016年7月15日 上午 07:59
    2016年7月14日 上午 11:19
  • 32位元的程式預設無法使用64位元的組件, 64位元的程式預設也無法使用32位元的組件, 所以先要確定您的VBA程式是那一種, 再製作適合的DLL供VBA程式使用
    • 已標示為解答 HSWayne 2016年7月15日 上午 07:59
    2016年7月15日 上午 04:20

所有回覆

  • VS2008 編譯時是 x86 還是 any cpu

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 HSWayne 2016年7月15日 上午 07:59
    2016年7月14日 上午 11:19
  • 感謝 心冷熱情熄 您提供的方向, 到組態管理員進行確認, 原本設定是Anycpu

    而將設定分別更改為 x86 and x64 進行建置, 建置皆成功, 但 x86 在註冊時會Error, 無法轉出 tlb

    而使用 x64 建置出的DLL註冊成功, 但引入VBA後仍然有Error 429, 註冊訊息如下

    X86
    C:\Windows\system32>RegAsm C:\Users\160404\Desktop\test\EasyTool.dll /tlb:C:\
    Users\160404\Desktop\test\EasyTool.tlb /codebase
    Microsoft .NET Framework Assembly Registration Utility 版本 4.6.1055.0
    for Microsoft .NET Framework 版本 4.6.1055.0
    Copyright (C) Microsoft Corporation.  著作權所有,並保留一切權利。

    RegAsm : error RA0000 : 由於這不是一個有效的 .NET 組件,所以無法載入 'C:\Users\1
    60404\Desktop\test\EasyTool.dll'

    X64
    C:\Windows\system32>RegAsm C:\Users\160404\Desktop\test\EasyTool.dll /tlb:C:\
    Users\160404\Desktop\test\EasyTool.tlb /codebase
    Microsoft .NET Framework Assembly Registration Utility 版本 4.6.1055.0
    for Microsoft .NET Framework 版本 4.6.1055.0
    Copyright (C) Microsoft Corporation.  著作權所有,並保留一切權利。

    已成功註冊類型
    組件已匯出到 'C:\Users\160404\Desktop\test\EasyTool.tlb',而且類型程式庫已成功登錄

    • 已標示為解答 HSWayne 2016年7月15日 上午 07:59
    • 已取消標示為解答 HSWayne 2016年7月15日 上午 07:59
    2016年7月14日 上午 11:46
  • 32位元的程式預設無法使用64位元的組件, 64位元的程式預設也無法使用32位元的組件, 所以先要確定您的VBA程式是那一種, 再製作適合的DLL供VBA程式使用
    • 已標示為解答 HSWayne 2016年7月15日 上午 07:59
    2016年7月15日 上午 04:20
  • 感謝 this 您提供的方向, 剛剛再與網管確認我的 Office 版本, 

    當初在安裝的時候是安裝Microsoft Office 2007 - 64 位元

    若您說的是建置的部分, 昨天的測試是將Any cpu, x86, x64

    三種位元版本的建置、註冊、引用、New都試過一次, 

    確認的結果Any cpu 和 x64 所建置出來的DLL是可以註冊、引用, 

    但 New(或是CreateObject) 時都會出現 錯誤 429, 而 x32 所建置

    的DLL是在註冊時就顯示 "error RA0000 : 由於這不是一個有效的 .NET 組件"

    無法順利轉出 tlb file 因此就無法做引用的動作

    2016年7月15日 上午 05:28
  • 註冊的時間加上codebase參數看看有沒有幫助, 例如:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /codebase TesteLib.dll

    2016年7月15日 上午 07:21
  • 十分感謝論壇各位專家的幫忙! 問題已解決,

    先說抱歉我沒搞清楚 Office 版本, 我的 Office 是 X86

    所以在VS2008的目標平台應選x86, 這是錯誤1

    x86 的DLL建置好後我又使用x64的RegAsm註冊工具進行註冊

    所以出現 "Error RA0000 : 由於這不是一個有效的 .NET 組件"

    應該使用C:\Windows\Microsoft.NET\Framework\v4.0.30319

    中的 x86 註冊工具進行註冊, 這是錯誤2

    使用正確的註冊工具對正確的檔案做註冊就解決了!

    再次感謝各位專家幫忙指引方向~

    2016年7月15日 上午 07:59