Как установить .NET DLL в приложение COM + с помощью MSI (WiX) - PullRequest
1 голос
/ 17 декабря 2008

Обновление: похоже, что это действительно ограничение WiX - Невозможно добавить 64-битный компонент com + (3.0.3907.0)

У меня есть приложение .NET с установщиком MSI, созданное с использованием WiX 2.0. Установщик создает приложение COM + (среди прочего) и устанавливает сборку .NET в качестве компонента в это приложение. Эта DLL-библиотека является чисто управляемой, однако она вызывает смешанную библиотеку DLL, которая может быть 32-разрядной или 64-разрядной. На 32-битной платформе все работает отлично. Однако в 64-разрядной версии процесс COM + dllhost.exe выполняется как 32-разрядный и впоследствии не может загрузить собственную DLL. Когда я просматриваю реестр, я вижу, что DLL-библиотека компонента COM + зарегистрирована под ключом Wow6432Node, и я предполагаю, что именно поэтому dllhost работает как 32-разрядный.

Если я использую оснастку «Службы компонентов» для удаления и повторного добавления библиотеки DLL, она все правильно регистрируется в «реальном» реестре, и dllhost запускается как 64-разрядный. Как заставить установщик сделать то же самое, т.е. правильно зарегистрировать его как 64-битную DLL? Я уже установил атрибут Package Platform на «x64» и установил атрибут Win64 = «yes» для каждого компонента, но, похоже, это не помогло.

Источник WiX для компонента COM + выглядит следующим образом:

      <Component Id="C_My.Server.dll_ComPlus" Guid="0117c6c5-387a-4b67-9a7f-273d5db3affd" Win64="yes">
        <File Id="F_My.Server.dll_ComPlus" Name="SERVER.DLL" LongName="My.Server.dll" Vital="yes" KeyPath="yes"
              Assembly="no" DiskId="1" Source="..\Server\bin\$(var.Configuration)\" />
        <pca:ComPlusApplication Id="MyServerComPlusApp" Name="My Server" RunForever="yes"
          ApplicationDirectory="[INSTALLDIR]ComPlusConfig" ApplicationAccessChecksEnabled="no"
          Identity="[ComPlusUserName]" Password="[ComPlusPassword]">
          <pca:ComPlusAssembly Id="MyServerComPlusAssembly" DllPath="[#F_My.Server.dll_ComPlus]"
            TlbPath="[#F_My.Server.tlb_ComPlus]" Type=".net" RegisterInCommit="yes">
            <pca:ComPlusComponent Id="CheckInterface" CLSID="d4cf3da5-83ad-4436-b174-eccdb121a9ea" />
          </pca:ComPlusAssembly>
        </pca:ComPlusApplication>
      </Component>

1 Ответ

1 голос
/ 17 декабря 2008

Скорее всего, это недостаток COM + CustomAction. Возможно, сейчас он поддерживает только 32-битный код.

...