Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Com 如何让我的WiX产品脚本正确安装active x控件?_Com_Wix - Fatal编程技术网

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

Com 如何让我的WiX产品脚本正确安装active x控件?,com,wix,Com,Wix,形势 我已经编写了一个自定义的activex控件,用于另一个非WEB应用程序。当我手动运行“regasm/codebase MyMacTest.dll”时,该控件已注册,可以使用jscript解释器在应用程序中使用。这意味着我需要创建一个ActiveXObject等 因此,我的下一步是使用Wix工具集3.11创建安装MSI。根据我读到的内容,我需要对dll运行Heat来创建输出wxs内容。我这样做了,并将其添加到我的product.wxs编译并运行。它正确部署了我的dll,验证了注册表项,但它在

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

因此,我的下一步是使用Wix工具集3.11创建安装MSI。根据我读到的内容,我需要对dll运行Heat来创建输出wxs内容。我这样做了,并将其添加到我的product.wxs编译并运行。它正确部署了我的dll,验证了注册表项,但它在应用程序中不起作用

我的c#代码:

已编译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>
===========================================

msi安装

[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安装为何将WOW6432节点添加到路径。。。但这些是不同之处


谢谢

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

你通常的做法很有效。要进行故障排除,您需要:

1) 创建虚拟机并对其进行快照

2) 安装MSI

3) 运行注册表差异工具,如安装Watch Pro或InControl智能驭享。拍摄注册表的快照

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

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

6) 检查这些差异是否存在有意义的相关差异,并将它们编入WXS源代码中

7) 重建MSI

8) 应用VM快照以恢复到干净状态

9) 安装MSI并重新测试功能

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

可以使用/regfile选项生成包含以下内容的.reg文件: 更改注册表项,而不是直接对 登记处。您可以通过导入来更新计算机上的注册表 使用注册表编辑器工具(Regedit.exe)创建.reg文件。请注意 .reg文件不包含任何可由用户进行的注册表更新 用户定义的寄存器函数。请注意,仅使用/regfile选项 发出托管类的注册表项。此选项不发射 TypeLibIDs或InterfaceID的条目

如果您无法解决此问题,我有25年处理此类问题的经验。如果您能够共享DLL并给我一个代码段进行冒烟测试,我可以创建一个WiX代码段来正确注册程序集


PS-我将合并这两个组件。COM/Registry元素应该与它们所用于的文件属于同一个组件。

您是否尝试使用and进行此操作?看看这个@PavelAnikhouski,我会看看这个线程,但是为了回答你的问题,我没有尝试使用TypeLib。正如我提到的,我是新来的,所以。。。仍在试验中。手动注销所有内容,然后安装MSI,仅使用
regedit.exe
导出
HKCR
,然后手动注册,仅再次导出
HKCR
,并使用任何diff工具区分导出的
*.reg
文件-例如。请报告差异。您还可以使用查看实际失败的部分—劳动密集型,但它可以工作。@SteinÅsmul我已经发布了差异。WOW6432节点路径与32位和64位组件注册有关。非常常见的问题。您的组件是64位还是32位?我需要出发一段时间,但也许你想在这里读一读:-如果我猜的话,我会说你需要将组件设置为64位。只需将Win64=“yes”添加到您的MSI组件中,并尝试一下。但总有更多的错误:-)克里斯托弗:目前没有访问干净的虚拟机的权限。。。但是我确实做了/regfile,我的产品wxs和regfile之间的唯一区别是代码基值的表示方式。。。。使用wix时,代码基值为:file///c:\program files(x86)\..\使用dump do/codebase/regfile时,代码基文件为:file///c/program files(x86)/。。。。等唯一的区别是file语句中的斜杠。至于我用来创建DLL的代码。。。这正是我在帖子中列出的。这是一个项目的概念证明。如果没有一个干净的环境,就不可能说这是否是唯一的区别。我已经发布了差异。我已经回答了如何做到这一点的过程。我无法在此网站上进一步帮助您,因为我没有DLL。如果您想获得一些免费帮助,请查找我的网站和联系信息,并通过电子邮件发送DLL以及如何测试调用其中的类,我可以在VM上快速执行上述操作。更新:请注意COM是位感知的。在您的示例中,您正在构建一个32位MSI,它将在32位注册表中安装COM服务器。您可能从64位进程调用它,但这不起作用。
<?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>
[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"
[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"