Как получить скрипт продукта WiX для правильной установки активного элемента управления x? - PullRequest
0 голосов
/ 16 января 2020

Ситуация Я написал собственный элемент управления Active X для использования в другом, не-WEB-приложении. когда я вручную запускаю "regasm / codebase MyMacTest.dll", элемент управления регистрируется и может использоваться в приложении с использованием интерпретатора jscript. Это означает, что мне нужно создать ActiveXObject et c ....

Итак, мой следующий шаг - создание установочного MSI с использованием набора инструментов Wix 3.11. В соответствии с тем, что я прочитал, мне нужно запустить Heat против DLL, чтобы создать выходной контент wxs. Я сделал это и добавил его в мой product.wxs, скомпилированный и запущенный. Он правильно развернул мою dll, проверил запись в реестре, однако она не работает в приложении.

Мой c# код:

using System;
using System.Runtime.InteropServices;

namespace MyMacTest
{
    [ProgId("MyMacTest.MacroTest")]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("765563f5-55b0-41e1-9f49-311ec88f6ba2")]
    [ComVisible(true)]
    public class MacroTest
    {
        public MacroTest()
        {

        }

        public string GetMessage()
        {
            return $"This is a test for {DateTime.Now}";
        }
    }
 }

Выход тепла для скомпилированной DLL:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
    <DirectoryRef Id="TARGETDIR">
        <Directory Id="dir39B22699688E51DCD8DCBB99A47E835B" Name="Debug" />
    </DirectoryRef>
</Fragment>
<Fragment>
    <DirectoryRef Id="dir39B22699688E51DCD8DCBB99A47E835B">
        <Component Id="cmp88AF0B935698304B52D96A0CEA4F7661" Guid="PUT-GUID-HERE">
            <Class Id="{765563F5-55B0-41E1-9F49-311EC88F6BA2}" Context="InprocServer32" Description="MyMacTest.MacroTest" ThreadingModel="both" ForeignServer="mscoree.dll">
                <ProgId Id="MyMacTest.MacroTest" Description="MyMacTest.MacroTest" />
            </Class>
            <File Id="filC0F476996EBA80AC7C8F27AA886F48E0" KeyPath="yes" Source="SourceDir\Debug\MyMacTest.dll" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="Class" Value="MyMacTest.MacroTest" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="Assembly" Value="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filC0F476996EBA80AC7C8F27AA886F48E0]" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="Class" Value="MyMacTest.MacroTest" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="Assembly" Value="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="CodeBase" Value="file:///[#filC0F476996EBA80AC7C8F27AA886F48E0]" Type="string" Action="write" />
        </Component>
    </DirectoryRef>
</Fragment>

Мой модифицированный продукт с фрагментом тепла:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"><?define MyMacTest_TargetDir=$(var.MyMacTest.TargetDir)?>
<Product Id="*" Name="MyMacSetup" 
       Language="1033" 
       Version="1.0.0.0" 
       Manufacturer="Mega Software Stuff" 
       UpgradeCode="b3e8921b-22da-4f05-a79f-36cafde09fce">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>

    <Feature Id="ProductFeature" Title="MyMacSetup" Level="1">
        <ComponentGroupRef Id="ProductComponents" />
  <ComponentRef Id="cmp88AF0B935698304B52D96A0CEA4F7661"/>
    </Feature>
</Product>

<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="Bp" Name="BPE">
      <Directory Id="Addin" Name="AddIns">
        <Directory Id="INSTALLFOLDER" Name="MyCustom" />
      </Directory>
    </Directory>
  </Directory>
</Directory>
</Fragment>

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
        <Component Id="MyMacTest.dll" Guid="21b3cee3-1da3-4f48-89db-7c2f6cf11431">
          <File Id="MyMacTest.dll" Name="MyMacTest.dll" Source="$(var.MyMacTest_TargetDir)MyMacTest.dll" />
        </Component>
    </ComponentGroup>
</Fragment>

<!-- This segment gotten from heat: "c:\Program Files (x86)\WiX Toolset v3.11\bin\heat" file MyMacTest.dll -out mymactest.wxs  -->
<Fragment>
<DirectoryRef Id="INSTALLFOLDER">
  <Component Id="cmp88AF0B935698304B52D96A0CEA4F7661" Guid="b33671b4-2f75-44bc-8435-f16c5f9b7268">
    <Class Id="{765563F5-55B0-41E1-9F49-311EC88F6BA2}" Context="InprocServer32" Description="MyMacTest.MacroTest" ThreadingModel="both" ForeignServer="mscoree.dll">
      <ProgId Id="MyMacTest.MacroTest" Description="MyMacTest.MacroTest" />
    </Class>
    <!--<File Id="filC0F476996EBA80AC7C8F27AA886F48E0" KeyPath="yes" Source="$(var.MyMacTest_TargetDir)MyMacTest.dll" />-->
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="Class" Value="MyMacTest.MacroTest" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="Assembly" Value="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#MyMacTest.dll]" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="Class" Value="MyMacTest.MacroTest" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="Assembly" Value="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32" Name="CodeBase" Value="file:///[#MyMacTest.dll]" Type="string" Action="write" />
  </Component>
</DirectoryRef>
</Fragment>
</Wix>

Мой вопрос на все это:

Проведя пару дней, я Я обнаружил, что об этом, похоже, много сообщений, но ничего, что давало бы мне пошаговый пример или объяснение того, как создать скрипт wix, который будет выполнять «regasm / codebase», что мне нужно сделать. Вроде путаницы. Это мой первый проект wix / MSI.

Чего мне не хватает и / или что мне нужно знать, чтобы это сработало? Есть ли хороший шаг за шагом, который я еще не нашел, на который можно указать?

Обновление с помощью diffs

регистрация вручную с помощью regasm / кодовая база

[HKEY_CLASSES_ROOT\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}]
@="MyMacTest.MacroTest"

[HKEY_CLASSES_ROOT\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\Implemented Categories]

[HKEY_CLASSES_ROOT\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]

[HKEY_CLASSES_ROOT\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="MyMacTest.MacroTest"
"Assembly"="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Users/Kevin/OneDrive/Documents/MyMacTest.DLL"

[HKEY_CLASSES_ROOT\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0]
"Class"="MyMacTest.MacroTest"
"Assembly"="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Users/Kevin/OneDrive/Documents/MyMacTest.DLL"

[HKEY_CLASSES_ROOT\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\ProgId]
@="MyMacTest.MacroTest"

======================================= ===

msi install

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}]
 @="MyMacTest.MacroTest"

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\Implemented Categories]

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
@=""

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="MyMacTest.MacroTest"
"Assembly"="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:\\Program Files (x86)\\BPE\\AddIns\\MyCustom\\MyMacTest.dll"

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\InprocServer32\1.0.0.0]
"Class"="MyMacTest.MacroTest"
"Assembly"="MyMacTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=583df5a1a2a0a8da"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:\\Program Files (x86)\\BPE\\AddIns\\MyCustom\\MyMacTest.dll"

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{765563F5-55B0-41E1-9F49-311EC88F6BA2}\ProgID]
@="MyMacTest.MacroTest"

Не уверен, почему установка MSI добавила WOW6432Node к путям ... но это различия.

Спасибо!

1 Ответ

1 голос
/ 16 января 2020

ОБНОВЛЕНИЕ: Помните, что COM поддерживает битность. В вашем примере вы создаете 32-битный MSI, который установит COM-сервер в 32-битный реестр. Вы можете вызывать его из 64-битного процесса, и это не сработает.

То, как вы делаете, обычно работает. Для устранения неполадок вам потребуется:

1) Создать виртуальную машину и сделать ее снимок

2) Установить MSI

3) Запустить средство сравнения реестра, например Install Watch Pro или InControl. Сделайте снимок реестра.

4) Вручную запустите команду regasm / codebase из командной строки с повышенными правами.

5) Сделайте еще один снимок реестра и запустите отчет diff.

6) Изучите различия для значимых значимых различий и запишите их в свой источник WXS.

7) Перестройте MSI

8) Примените снимок виртуальной машины, чтобы вернуться к чистому состояние.

9) Установите MSI и повторите тестирование.

Если вам интересно, почему нагрев не работает сам по себе, ответ связан с COM. Иногда техники нюхания просто не работают. В случае. NET COM Interop / COM Visible сборки иногда ответ заключается в этом предостережении. В вашем случае это может быть связано с использованием вами атрибута ClassInterface.

https://docs.microsoft.com/en-us/dotnet/framework/tools/regasm-exe-assembly-registration-tool

Вы можете использовать параметр / regfile для генерации REG-файл, который содержит записи реестра вместо внесения изменений непосредственно в реестр. Вы можете обновить реестр на компьютере, импортировав файл .reg с помощью редактора реестра (Regedit.exe). Обратите внимание, что файл .reg не содержит каких-либо обновлений реестра, которые могут быть сделаны пользовательскими функциями реестра. Обратите внимание, что параметр / regfile создает только записи реестра для управляемых классов. Этот параметр не создает записи для TypeLibID или InterfaceID.

Если вы не можете решить эту проблему, у меня 25-летний опыт работы с этими типами проблем. Если вы сможете поделиться библиотекой DLL и дать мне фрагмент кода для тестирования дыма, я мог бы создать фрагмент WiX, который правильно регистрирует сборку.

PS - я бы слил эти два компонента. Элементы COM / Registry должны принадлежать тому же компоненту, что и файл, для которого они предназначены.

...