2016-12-05 35 views
0

林顯影C#中的COM對象,VS 2010,NET 3.5的,X86COM對象 - 陣列作爲對象,而不是類型

我曾經有結構中的COM對象一個陣列,該陣列在VBA出現了罰款與所有的領域和一切。

因爲它創建了一些問題,我切換到類。 現在我怎麼不能訪問數組中的屬性,因爲數組中的元素顯示爲對象而不是類型。

[Guid("8b65079f-5d98-41e7-9579-1ee384948e4c")] 
[ComVisible(true)] 
public interface IContact 
{ 
    string Test1 { get; set; } 
    string[] Array1 { get; set; } 
} 

[Guid("8b65089f-5d98-41e7-9579-1ee384948e4c")] 
[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
public class Contact : IContact //Used To Be a struct 
{ 
    //[MarshalAs(UnmanagedType.BStr)] 
    public string Test1 { get; set; } 
    public string[] Array1 { get; set; } 
} 

public class InContainer 
{ 

     public Contact[] Contacts { get;set;} 
     public string[] strings { get; set; } 
} 

在調試我看到觀看場時:

Container.Contacts() - 作爲對象>(0至4)

代替

Container.Contacts() - >(0 To 4)As聯繫方式

我在想什麼?謝謝!

+0

That's一個,你看鴕鳥政策* what's裏面*。順便說一句:爲什麼這個問題標籤爲C#? – HimBromBeere

+0

com對象是用C#編寫的 但是我看到裏面是什麼,當它是一個結構體,並且我沒有其他類的問題 – PonWer

+0

我認爲即使在VBA中您也可以使用typeof來測試對象類型。可能值得一試。 – bilpor

回答

1

這裏有一些事情你可以檢查:

  1. 確保你的容器類是正確的聲明(我想這已經是COM可見的,但是這不是你的樣本中所示:

    [Guid("EA34C9D6-3EAA-4D44-A8BA-81CC2E79090B")] 
    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class InContainer 
    
  2. 正確註冊使用regasm的正確版本的組件(可能是你所需要的32位之一)與/codebase開關:

    regasm /codebase <myassembly.dll> 
    
  3. 在VBA中,實例化您的容器,例如使用後期綁定:

    Sub Test() 
        Dim a As Object 
        Set a = CreateObject("Issue40977311.InContainer") 
    End Sub 
    

    這將導致正確的類型正在顯示:

    regasm /codebase <myassembly.dll> /tlb 
    

    enter image description here

    另外,您還可以使用regasm的/tlb開關創建類型庫

    並通過將參考添加到VBA中創建的.tlb文件工具>參考>瀏覽。然後,您可以實例化你的對象如下:

    與COM工作時的注意事項的
    Sub Test() 
        Dim a As Object 
        Set a = New Issue40977311.InContainer 
    End Sub 
    
相關問題