Невозможно создать экземпляр библиотеки COM, созданной с помощью Visual Studio 2008 в VBA, внутри 64-разрядного приложения. - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь создать библиотеку объектов, которую можно зарегистрировать и использовать из VBA, используя 64-разрядную версию Excel 2010. Я использую Dev Studio 2008. Я думаю, что это проблема 64-разрядной версии, так как я почти уверен, что это сработало, когда я пытался это с моей предыдущей версией Excel (XP). Я нажал «Сделать COM видимым» в диалоговом окне «Информация о сборке» и «Зарегистрироваться для взаимодействия COM» в теге сборки. Когда я устанавливаю целевой тип x64, я вообще не вижу библиотеку в диалоге ссылок. Если я выберу любой ЦП, я могу зарегистрировать его, но получаю сообщение об ошибке «Не удается создать активный объект X» при попытке его создания.

namespace Tester
{
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface _Numbers
    {       
        int GetDay();
        int GetMonth();
        int GetYear();
        int DayOfYear();
    }

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Tester.Numbers")]
    public class Numbers : _Numbers
    {
        public Numbers(){}

        public int GetDay()
        {
            return(DateTime.Today.Day);
        }

        public int GetMonth()
        {
            return(DateTime.Today.Month);
        }

        public int GetYear()
        {
            return(DateTime.Today.Year);
        }

        public int DayOfYear()
        {
            return(DateTime.Now.DayOfYear);
        }
    }
}

1 Ответ

1 голос
/ 24 апреля 2011

Поскольку Visual Studio является 32-разрядным процессом, он по ошибке запустит 32-разрядную версию regasm.exe , чтобы зарегистрировать 64-разрядную сборку. Конечно, эта версия regasm.exe будет записывать данные в 32-разрядную часть реестра, так что это не будет работать.

Один из способов решения этой проблемы - запустить 64-битную версию regasm.exe на целевой сборке самостоятельно (например, на этапе после сборки). Вам нужно будет экспортировать библиотеку типов, используя параметр /tlb, и вам также нужно будет передать параметр /codebase, поскольку сборка не находится в GAC:

"%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\regasm.exe"
    /tlb /codebase "$(TargetPath)"
...