2011-08-22 67 views
0

我已經使用Visual Studio 2008轉換向導將VB6代碼移植到VB.Net。被移植的代碼正確編譯。從VB調用受管DLL的問題6代碼

我已檢查編譯器選項以註冊項目屬性上的COM互操作。在構建項目時,我得到了DLL和TLB文件。

我一直在使用下面的命令

regasm myLib.DLL /tlb:myLib.tlb 

之後註冊的組件,我已經GACed使用現在

gacutil /i myLib.DLL 

大會,VB代碼,這是消費DLL ...

Dim myObject 
    Set myObject= CreateObject("myLib.MyObject") 

..發生錯誤 -

運行時錯誤429,ActiveX組件不能創建對象。

我需要做些什麼才能正確地工作?

回答

1

一兩件事來檢查已經引起了我出去了過去: -

如果在.NET側構造函數拋出一個錯誤(無論是處理與否),並且使用VB6中創建對象CreateObject,您會收到一個Runtime Error 429, ActiveX componenet cant create object.

在開發過程中你最好添加到您的管理項目的引用,並使用:

Dim myObject 
Set myObject = New myLib.MyObject 

這樣,你至少可以看到一個錯誤已經被扔在人老年方面。

+0

創建了一個虛擬問題來測試這個問題,這個問題有效。我發現使用procmon的一個區別是,對於虛擬項目,運行時在HKCR \ MyDummyLib.MyObject下找到一個條目。但是我的圖書館找不到它。任何想法? –

1
  1. 從基礎開始,你是否將你想要公開的對象設置爲ComVisible?如果我沒有記錯,Visual Studio 2008在組件級別默認具有ComVisible(false),在早期的Visual Studio版本中它默認爲True。

編輯#1:

  1. 您使用的是深層嵌套的命名空間或複雜的裝配的名字嗎?我發現使用mycompany.myproduct.subcomponent樣式命名約定的程序集和命名空間與類型導出器名稱混淆。它使用命名空間創建VB6中需要的編程ID的左側。

  2. 運行RegAsm時輸出什麼信息?如果它找不到任何類型的註冊,它通常會告訴你。

  3. 檢查TypeLib,看看你期望看到的類型是否在那裏。您可以直接從VB6中引用tlb,然後按F2來查看TypeLib。您可以使用Visual Studio 6附帶的OLE視圖。

  4. 您是否在註冊組件時嘗試使用/ codebase選項以查看其行爲是否有所不同?我幾乎總是使用代碼庫註冊,因爲這與常規COM註冊的工作原理類似。

+0

ComVisible在彙編級別是正確的。 –

+0

我不知道爲什麼它重新啓動我在1編號,但我添加了一些後續建議。 – tcarvin