Question

J'ai une bibliothèque de classe simple que je l'utilise dans Excel. Voici une simplification de ma classe ...

using System;
using System.Runtime.InteropServices;

namespace SimpleLibrary
{
 [ComVisible(true)]
 public interface ISixGenerator
 {
  int Six();
 }

 public class SixGenerator : ISixGenerator
 {
  public int Six() 
  {
   return 6; 
  }
 }
}

Dans Excel 2007 je voudrais créer une macro activé classeur et ajouter un module avec le code suivant:

Public Function GetSix()
    Dim lib As SimpleLibrary.SixGenerator
    lib = New SimpleLibrary.SixGenerator
    Six = lib.Six
End Function

Ensuite, dans Excel je pourrais appeler la fonction GetSix () et il retournerait six. Ce ne fonctionne plus dans Excel 2010 64 bits. Je reçois une erreur d'exécution « 429 »:. Composant ActiveX ne peut pas créer un objet

J'ai essayé de changer la cible de plate-forme 64 bits au lieu de toute CPU mais mon code ne compilerait pas à moins que je décoché le Registre pour COM Interop option faisant le rend si mon classeur de macros permet ne peut pas voir SimpleLibrary.dll comme il est plus regsitered.

Toutes les idées comment je peux utiliser ma bibliothèque Excel 2010 64 bits?

Était-ce utile?

La solution

Vous n'avez pas décrit en détail comment vous avez créé votre assembly .NET. Cependant, il y a un certain nombre d'étapes nécessaires pour exposer l'ensemble à COM:

  • Ajoutez les attributs suivants à votre code:

    using System;
    using System.Runtime.InteropServices;
    
    namespace SimpleLibrary
    {
        [ComVisible(true)]
        [Guid("71F645D0-AA78-4447-BA26-3A2443FDA691")]
        public interface ISixGenerator
        {
            int Six();
        }
    
        [ComVisible(true)]
        [ProgId("SimpleLibrary.SixGenerator")]
        [Guid("8D59E0F6-4AE3-4A6C-A4D9-DFE06EC5A514")]
        [ClassInterface(ClassInterfaceType.AutoDispatch)]
        public class SixGenerator : ISixGenerator
        {
            [DispId(1)]
            public int Six()
            {
                return 6;
            }
        }
    }        
    
  • Votre assemblage doit être signé ( Projet -> Propriétés ... -> Connexion , créez un fichier de clé forte et cochez la case pour signer l'assembly

  • La commande suivante est nécessaire d'enregistrer l'ensemble (en une seule ligne):

    C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe 
                      SimpleLibrary.dll /tlb SimpleLibrary.tlb /codebase
    

    Cela crée un fichier de bibliothèque de type .tlb que vous devrez référence de votre projet VBA ( Outils -> Références -> Parcourir ... dans votre éditeur VBA)

  • Régler le code VBA:

    Public Function GetSix()
        Dim lib As SimpleLibrary.SixGenerator
        Set lib = New SimpleLibrary.SixGenerator
        GetSix = lib.Six
    End Function
    

Vous trouverez les étapes décrites plus en détail dans cet article sur la base de données de support de Microsoft:

  

Comment appeler un Visual Basic .NET ou Visual Basic 2005 assemblage à partir de Visual Basic 6.0

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top