2013-09-23 70 views
2

我想弄清楚如何解決這個問題。我嘗試了很多我在互聯網上看到但沒有成功的事情。我試過:使用regasm,編譯目標爲x86,dumpbin dll /t:dll.tlb,更改Framework等版本。自定義C#DLL給VBA 429錯誤

我有兩臺機器(M1和M2),都帶有Windows 7 64和VS2012。當我在M1中開發COM時,它在M1的VBA中運行良好。但它不適用於M2(錯誤429)。然後,如果我去M2並編寫一個新的COM,它在M2的VBA中工作正常,但不適用於M1。

看來,VS2012正在執行我看不到的「隱藏」註冊步驟。有人知道如何找到它嗎?

非常感謝!下面是我的「COM Hello World」。我也使用Register for COM interop。

UPDATE:

如果我運行:

C:\windows\Microsoft.NET\Framework\v4.0.30319\regasm TesteLib.dll /TesteLib.tlb 

429錯誤消失。但現在,而不是錯誤429,我得到「錯誤-2147024894(80070002)自動化錯誤」在同一行。

我按照Can't instantiate a COM object written in C# from VBA (VB6 ok)的解決方案在EXCEL.exe文件夾內創建了一個Excel.Exe.Config,現在我的程序運行良好。但我認爲我無法在客戶機上執行此操作。有沒有其他的選擇?

此外,它在VB6中工作正常(不需要執行REGASM)。

.NET側

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 

namespace TesteLib 
{ 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    [Guid("c6b093c6-f568-4962-8955-795fc14f34bb")] 
    [ComVisible(true)] 
    public interface ClassInt1 
    { 
     int sum(int a, int b); 
    } 

    [ClassInterface(ClassInterfaceType.None)] 
    [Guid("19ff9b41-8652-4012-ac55-c1a1d8f18cbb")] 
    [ComVisible(true)] 
    [ProgId("TesteLib.Class1")] 
    public class Class1 : COMException, ClassInt1 
    { 
     public int sum(int a, int b) 
     { 
      return a + b; 
     } 
    } 

} 

VBA側

Sub t() 
    Dim r As TesteLib.Class1 
    Set r = New TesteLib.Class1 'Run-time error '429': ActiveX component can't create object 
    MsgBox r.Sum(35, 51) 
End Sub 
+0

試過遲綁定? – 2013-09-24 07:18:18

+0

是的!我試過了。 –

+0

註冊管理員權限?我知道肯定勝利7 x64和vs12和一臺計算機,如果我不以管理員身份啓動vs2012,* .dll將不會被註冊。只是提醒真的 – 2013-09-24 14:15:25

回答

3

現在,它的工作!

我需要使用REGASM的選項/代碼庫註冊DLL

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

當我包括選項/代碼庫它生成一個警告,但它的工作原理:RegAsm警告:註冊一個無符號的組件用/ codebase可能會導致您的程序集干擾可能安裝在同一臺計算機上的其他應用程序。/codebase開關僅用於簽名程序集。請給你的組裝一個強大的名字,並重新註冊它

然後,在VS2012中,我標記了選項Project Properties> Signing>簽署程序集> New ...並運行REGASM。警告消失了,現在一切似乎都很好:)

謝謝!