如何让我的 WiX 产品脚本正确安装我的活动 x 控件?

  • 本文关键字:安装 活动 控件 WiX 脚本 com wix
  • 更新时间 :
  • 英文 :


这种情况我已经编写了一个自定义的Active X控件,以便在另一个非WEB应用程序中使用。 当我手动运行"regasm/codebase MyMacTest.dll"时,控件已注册,可以使用jscript解释器在应用程序中使用。 这意味着我需要创建一个ActiveXObject等....

所以我的下一步是使用 Wix 工具集 3.11 创建一个安装 MSI。根据我所读到的内容,我需要对 dll 运行 Heat 以创建输出 wxs 内容。 我这样做了,并将其添加到我的产品.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="SourceDirDebugMyMacTest.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}InprocServer321.0.0.0" Name="Class" Value="MyMacTest.MacroTest" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}InprocServer321.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}InprocServer321.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}InprocServer321.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.11binheat" 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}InprocServer321.0.0.0" Name="Class" Value="MyMacTest.MacroTest" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}InprocServer321.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}InprocServer321.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}InprocServer321.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项目。

我错过了什么和/或我需要知道什么才能完成这项工作? 有没有一个好的一步一步的某个地方,我还没有找到,我可以被指出?

使用差异进行更新

手动注册 regasm/代码库

[HKEY_CLASSES_ROOTCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}]
@="MyMacTest.MacroTest"
[HKEY_CLASSES_ROOTCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}Implemented Categories]
[HKEY_CLASSES_ROOTCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}Implemented Categories{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOTCLSID{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_ROOTCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}InprocServer321.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_ROOTCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}ProgId]
@="MyMacTest.MacroTest"

====

===============================================微星安装

[HKEY_CLASSES_ROOTWOW6432NodeCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}]
@="MyMacTest.MacroTest"
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}Implemented Categories]
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}Implemented Categories{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
@=""
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{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_ROOTWOW6432NodeCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}InprocServer321.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_ROOTWOW6432NodeCLSID{765563F5-55B0-41E1-9F49-311EC88F6BA2}ProgID]
@="MyMacTest.MacroTest"

不知道为什么 MSI 安装将 WOW6432Node 添加到路径中...但这些是区别。

谢谢!

更新:请注意,COM 是位感知的。 在您的示例中,您正在构建一个 32 位 MSI,它将在 32 位注册表中安装 COM 服务器。 您可能从 64 位进程调用它,但这不起作用。

你做事的方式通常有效。要进行故障排除,您需要:

1( 创建 VM 并创建快照

2( 安装您的微星

3( 运行注册表差异工具,例如安装手表专业版或智能驭领智能驭领。 拍摄注册表的快照。

4( 从提升的命令提示符手动运行 regasm/codebase 命令。

5( 拍摄注册表的另一个快照并运行差异报告。

6( 检查差异以获得有意义的相关差异,并将它们创作到 WXS 源中。

7( 重建微星

8( 应用 VM 快照以返回到干净状态。

9( 安装 MSI 并重新测试功能。

如果你想知道为什么热量本身不起作用,答案与COM有关。 有时嗅探技术不起作用。 对于 .NET COM 互操作/COM 可见程序集,有时答案就在此警告中。 在您的情况下,这可能与您使用 ClassInterface 属性有关。

https://learn.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/注册表元素应属于与其所针对的文件相同的组件。

最新更新