RegistrationHelper.InstallAssembly и 64-битная - PullRequest
1 голос
/ 25 февраля 2011

Я получил winsvr2008r2 x64, на котором я сделал следующее наблюдение:

Если я создаю приложение COM + вручную и вручную устанавливаю все компоненты через графический интерфейс служб компонентов, все работает как 64-разрядная.

Но если я установлю все, используя код (System.EnterpriseServices.RegistrationHelper.InstallAssembly), компоненты COM + будут работать как 32-битные.

Можно ли заставить все работать как 64-битные при использовании InstallAssembly?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Я не знаю, является ли это ошибкой или нет, но это, вероятно, связано со свойством компонента "Bitness" COM +: Коллекция компонентов

Как указано в документе "Битность "может быть установлен на 1 (32-разрядный) или 2 (64-разрядный).Вы можете прочитать значение Bitness для данного компонента, используя такой код C #:

    COMAdminCatalog catalog = new COMAdminCatalogClass();

    ICatalogCollection appCollection = (ICatalogCollection)catalog.GetCollection("Applications");
    appCollection.Populate();

    // browse all apps
    foreach (COMAdminCatalogObject app in appCollection)
    {
        Console.WriteLine("application=" + app.Name);
        // browse all components
        ICatalogCollection compCollection = (ICatalogCollection)appCollection.GetCollection("Components", app.Key);
        compCollection.Populate();
        foreach (COMAdminCatalogObject comp in compCollection)
        {
            Console.WriteLine(" component=" + comp.Name);
            Console.WriteLine(" bitness=" + comp.get_Value("Bitness"));
        }

    }

К сожалению, Bitness является свойством ReadOnly.Из того, что я понимаю, базовый процесс регистрации COM использует битность процесса, фактически выполняющего регистрацию, чтобы определить, как установить это свойство.

Это косвенно объясняется в этой статье: Обслуживаемые компоненты в 32-Битовая и 64-битная архитектура

Как видно из таблицы, регистрация в 64 или 32 бита зависит от версии используемого вами инструмента.Вот почему такой инструмент, как Regsvcs.exe, доступен в двух вариантах: 32 и 64-битных, и от этого просто зависит, как ваш компонент регистрируется.Кроме того, обратите внимание на то, что вещи могут отличаться, если приложение COM + пусто или нет.

Я думаю, это означает, что ваш работающий .EXE должен быть скомпилирован в 64-битной версии.

0 голосов
/ 07 марта 2011

Когда вы вызываете InstallAssembly, внутренне вызывается метод ValidateBitness, который проверяет, была ли сборка уже установлена ​​с неправильной битностью, и в этом случае она сообщает об ошибке и выдает ошибку RegistrationException.Он определяет, какая «правильная» битность зависит от результата вызова IsWow64Process.

Если посмотреть дальше, то представляется, что существует один способ регистрации для 64-битной и 32-битной систем. Это кажется правильным,поскольку регистрация зависит от разрядности запущенного приложения (которое вызывает InstallAssembly).Можете ли вы подтвердить, что он действительно работает как 64-битный?

Возможно, вы столкнулись с сообщенной ошибкой, помеченной "не будет исправлено в ближайшее время".Я не могу судить, является ли эта ошибка полностью применимой к вашему сценарию, потому что я не уверен, вызывает ли установка те же функции API внутри.См. этот пост в Microsoft Connect о регистрационных ключах, хранящихся в неправильном улье .

...