2016-12-05 3 views
0

Im разрабатывающей COM объекта в C#, VS 2010, .Net 3.5, x86COM Object - Массив как объект вместо типа

Я использовал, чтобы иметь массив структур в 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) As Object

вместо

Container.Contacts() -> (0 до 4) Как связаться

Что мне не хватает? Благодаря!

+0

That's один из предостережений при работе с COM, вы не видите, как там * внутри *. Btw: почему этот вопрос помечен 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 
    

    Это приводит к правильному типу показывается:

    enter image description here

    Кроме того, вы также можете создать библиотеку типов, используя /tlb переключатель Regasm:

    regasm /codebase <myassembly.dll> /tlb 
    

    и добавьте ссылку на созданный файл .tlb в VBA через Инструменты> Ссылки> Обзор. Вы можете создать экземпляр объекта следующим образом:

    Sub Test() 
        Dim a As Object 
        Set a = New Issue40977311.InContainer 
    End Sub 
    
Смежные вопросы