2016-12-05 3 views
0

Im ein COM-Objekt in C# entwickelt, VS 2010, .NET 3.5, x86COM Object - Array als Objekt statt Typ

verwenden ich ein Array von Strukturen in dem COM-Objekt zu haben, die in VBA auftauchten gut mit allen Feldern und allem.

Ich wechselte in die Klasse seit es einige Probleme erstellt. Nun kann ich jedoch nicht auf die Eigenschaften im Array zugreifen, da die Elemente im Array als Objekt statt als Typ angezeigt werden.

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

Im Debugger ich sehe, wenn das Feld sehen:

Container.Contacts() -> (0 bis 4) As Object

statt

Container.Contacts() -> (0 bis 4) Wie Kontakt

Was fehlt mir? Vielen Dank!

+0

Das ist eine der Einschränkungen, wenn sie mit COM arbeiten, eröffnen Sie bitte was noch sehen * innen *. Btw .: Warum ist diese Frage mit C# markiert? – HimBromBeere

+0

Das com-Objekt ist in C geschrieben # Aber ich sah, was drin war, wenn es eine Struktur war, und ich habe kein Problem mit anderen Klassen – PonWer

+0

Ich denke, sogar in VBA können Sie typeof verwenden, um den Objekttyp zu testen. Könnte einen Versuch wert sein. – bilpor

Antwort

1

Hier sind einige Dinge, die Sie überprüfen können:

  1. Achten Sie darauf, Ihre Container-Klasse korrekt deklariert ist (ich denke, es ist schon COM-sichtbar, aber das ist nicht in Ihrer Probe gezeigt:

    [Guid("EA34C9D6-3EAA-4D44-A8BA-81CC2E79090B")] 
    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class InContainer 
    
  2. korrekt Ihre Assembly registrieren, um die richtige Version von regasm mit (wahrscheinlich müssen Sie die 32-Bit-one) mit dem /codebase Schalter:

    regasm /codebase <myassembly.dll> 
    
  3. In VBA Instanziieren Sie Ihren Container, z. mit später Bindung:

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

    Dieser in den richtigen Typen Ergebnisse gezeigt werden:

    enter image description here

    Alternativ können Sie auch eine Art Bibliothek mit dem /tlb Schalter von regasm erstellen:

    regasm /codebase <myassembly.dll> /tlb 
    

    und fügen Sie den Verweis auf die erstellte .tlb-Datei in VBA über Tools> Referenzen> Durchsuchen. Anschließend können Sie Ihr Objekt instanziiert wie folgt:

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