2016-12-05 1 views
0

Im le développement d'un objet COM en C#, VS 2010, .Net 3.5, x86COM Object - tableau comme objet au lieu de type

Je l'habitude d'avoir un tableau de struct dans l'objet COM, qui en VBA est apparu bien avec tous les champs et tout.

Je suis passé en classe car cela a créé des problèmes. Maintenant, comment je ne peux pas accéder aux propriétés dans le tableau, puisque les éléments dans le tableau apparaissent comme un objet au lieu de type.

[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; } 
} 

Dans le débogueur je vois en regardant le terrain:

Container.Contacts() -> (0 à 4) comme objet

au lieu de

Container.Contacts() -> (0 à 4) Comme Contact

Que manque-t-il? Merci!

+0

Thats une des mises en garde lorsque vous travaillez avec COM, vous ne pas voir machin * à l'intérieur *. Btw .: pourquoi cette question est-elle étiquetée C#? – HimBromBeere

+0

L'objet com est écrit en C# Mais j'ai vu ce qui était à l'intérieur quand c'était un struct, et je n'ai aucun problème avec les autres classes – PonWer

+0

Je pense que même dans VBA vous pouvez utiliser typeof pour tester le type d'objet. Cela pourrait valoir le coup. – bilpor

Répondre

1

Voici quelques choses que vous pouvez vérifier:

  1. Assurez-vous que votre classe de conteneur est déclarée correctement (je suppose qu'il est déjà COM visible, mais ce n'est pas montré dans votre échantillon:

    [Guid("EA34C9D6-3EAA-4D44-A8BA-81CC2E79090B")] 
    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class InContainer 
    
  2. enregistrer correctement votre assemblage en utilisant la version correcte de regasm (probablement vous avez besoin de 32 bits un) avec le commutateur /codebase:

    regasm /codebase <myassembly.dll> 
    
  3. En VBA, instanciez votre conteneur, par ex. en utilisant la liaison tardive:

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

    Il en résulte les types corrects sont affichés:

    enter image description here

    Alternativement, vous pouvez également créer une bibliothèque de type en utilisant l'interrupteur /tlb de regasm:

    regasm /codebase <myassembly.dll> /tlb 
    

    et d'ajouter la référence au fichier .tlb créé dans VBA via Outils> Références> Parcourir. Vous pouvez ensuite instancier votre objet comme suit:

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