[.net] Impossibile accedere ai metodi COM esposti in VBA


Answers

Stavo avendo lo stesso problema. Ho trovato questo link.

Guida alla chiamata di una libreria .net da excel Se mi riferisco a un file TLB chiamato "Foo.tlb" che ha una classe chiamata "FooClass" che ha membri pubblici. Non sarai in grado di vedere quei membri perché sono costruiti di default solo con l'interfaccia di binding tardivo (binding in fase di esecuzione).

Puoi cambiare la tua classe in modo da avere l'associazione anticipata, che consentirà a intellisense e ai membri della classe di essere esposti nel browser degli oggetti.

C #:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class FooClass
{
    public FooClass()
    {
    }
    public string DoSomething()
    {
        return "I am printing....";
    }
}

Dovresti essere in grado di vedere il metodo DoSomething nel browser degli oggetti dopo aver implementato questa modifica. Nota: dovrai prima deferire la dll.

Question

Sto cercando di accedere ai metodi COM esposti in VBA.

Problema: sto visualizzando tutti i metodi predefiniti (come GetHashCode , GetType e ToString ) in VBA ma non quelli che fanno parte dell'interfaccia COM e specificamente scritti per essere visibili COM (come getStringValue() seguito).

Imposta i dettagli:

  • Visual Studio 2008
  • Windows 7 x64
  • Office 2007
  • .NET 3.5

Interfaccia "IGetMyString.cs"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace SimpleCOMAssembly
{
    [ComVisible(true), GuidAttribute("4153A1AC-ECE9-4f66-B56C-1DDEB6514D5D")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    interface IGetMyString
    {
        [DispId(1)]
        string getStringValue();
    }
}

Implementazione "GetMyString.cs"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace SimpleCOMAssembly
{
    [ComVisible(true), GuidAttribute("0A3D4D65-CF50-4020-BF13-77001F8AAABE")]
    [ProgId("SimpleCOMAssembly.GetMyString")]
    [ClassInterface(ClassInterfaceType.None)]
    public class GetMyString : IGetMyString
    {
        public GetMyString() { }

        [ComVisible(true), Description("Get my string")]
        public string getStringValue()
        {
            return "hello";
        }
    }
}

In Costruisci proprietà, ho controllato "Rendi COM visibile l'assemblaggio" (vedi sotto l'istantanea)

Ha anche chiesto a Visual Studio 2005 di creare il "registro per l'interoperabilità COM" (vedere lo snapshot di seguito)

E, infine, come evento post-build, sto eseguendo il regasm.exe per registrare il file .DLL e anche il .TLB nel registro come segue:

%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\regasm /codebase "$(TargetPath)" /tlb:"$(TargetDir)$(TargetName).lib"

Nella vista Esplora oggetti di Excel, ho abilitato il server COM (SimpleCOMAssembly scritto sopra), e ora nell'Explorer oggetti non elenca il metodo dell'interfaccia COM (vedi sotto)

Qualcuno può aiutarmi a sapere che cosa mi manca e che causa i metodi dell'interfaccia COM non visualizzati in VBA?

MODIFICA Allegare la vista ITypeLib del TLB generato