64-разрядная версия Excel 2010 не может создать объект .net - PullRequest
4 голосов
/ 27 апреля 2010

У меня есть простая библиотека классов, которую я использую в Excel. Вот упрощение моего класса ...

using System;
using System.Runtime.InteropServices;

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

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

В Excel 2007 я бы создал книгу с поддержкой макросов и добавил модуль со следующим кодом:

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

Тогда в Excel я мог бы вызвать функцию GetSix (), и она вернула бы шесть. Это больше не работает в Excel 2010 64bit. Я получаю сообщение об ошибке «429»: компонент ActiveX не может создать объект.

Я попытался изменить целевую платформу на x64 вместо любого ЦП, но тогда мой код не скомпилировался бы, если я не снял флажок с параметра «Регистрация для COM-взаимодействия», из-за этого моя книга включения макросов не может видеть SimpleLibrary.dll в том виде, как она есть больше не регистрируется.

Есть идеи, как использовать библиотеку в 64-разрядной версии Excel 2010?

1 Ответ

3 голосов
/ 28 апреля 2010

Вы не описали подробно, как вы создали вашу сборку .NET. Однако для предоставления доступа к сборке для COM требуется определенное количество шагов:

  • Добавьте следующие атрибуты в ваш код:

    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;
            }
        }
    }        
    
  • Ваша сборка должна быть подписана ( Проект -> Свойства ... -> Подписание , создать файл надежного ключа и установить флажок для подписи сборки

  • Следующая команда необходима для регистрации сборки (все в одной строке):

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

    Это создает файл библиотеки типов .tlb, на который вам нужно будет ссылаться из вашего проекта VBA ( Сервис -> Ссылки -> Обзор ... в редакторе VBA)

  • Настройте код VBA:

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

Вы найдете шаги, описанные более подробно в этой статье, в базе данных поддержки Microsoft:

Как вызвать сборку Visual Basic .NET или Visual Basic 2005 из Visual Basic 6.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...