2016-12-05 125 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 
    
相关问题