Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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
从C#为VB注册dll:Regasm工作,WiX不工作:运行时430_C#_Vb.net_Excel_Dll_Wix - Fatal编程技术网

从C#为VB注册dll:Regasm工作,WiX不工作:运行时430

从C#为VB注册dll:Regasm工作,WiX不工作:运行时430,c#,vb.net,excel,dll,wix,C#,Vb.net,Excel,Dll,Wix,我在C#中创建了一个dll。它有一个带有guid和staff的接口,以便在Excel VB中支持intellisense。当我自动注册它(在MSV中选中几个复选框)或使用regasm mydll.dll/tlb:mydll.dll时,它工作正常 但是我想使用WiX将它与我的程序的其余部分一起自动部署。 我使用了这里描述的热量 引述: Run: Regasm MyDLL.dll /tlb:MyDLL.tlb Run: Heat file MyDLL.dll -out MyDll-1.wxs R

我在C#中创建了一个dll。它有一个带有guid和staff的接口,以便在Excel VB中支持intellisense。当我自动注册它(在MSV中选中几个复选框)或使用regasm mydll.dll/tlb:mydll.dll时,它工作正常

但是我想使用WiX将它与我的程序的其余部分一起自动部署。 我使用了这里描述的热量

引述:

Run: Regasm MyDLL.dll /tlb:MyDLL.tlb

Run: Heat file MyDLL.dll -out MyDll-1.wxs

Run: Heat file MyDll.tlb -out MyDll-2.wxs
MyDll-2.wxs包含一个要复制并嵌套在MyDll-1.wxs中生成的元素内的元素。这将为您提供一个可以在安装程序项目中使用的完整元素

这样Excel会显示加载dll时出错,并且在路径中会显示指向我的dll的正确路径

如果我只是在WiX中放置两个单独的组件,dll被添加到Excel VB中,Intellisense工作,并且显示的路径是tlb,而不是dll。但帝王主义也是如此,所以我认为这是正确的。但是,当我在Excel VB中运行代码时,出现以下错误:

运行时“430”: 类不支持自动化或不支持预期的接口

再说一次,如果我直接使用regasm,一切正常

那么我应该如何在WiX中实现它呢

提前谢谢

更新:

在用dll作为参数调用它之后,我得到

<Component Id="cmp199C512A0B3C2ACB727633983C104D83" Guid="306F6849-3C35-4602-AB76-2FD993D675C4">
            <Class Id="{97B04EDD-D0FC-4429-98FE-8D942E31CA98}" Context="InprocServer32" Description="Synthec.SynthecHandler" ThreadingModel="both" ForeignServer="mscoree.dll">
                <ProgId Id="Synthec.SynthecHandler" Description="Synthec.SynthecHandler" />
            </Class>
            <File Id="filAEDB64435A66D04AC60E3377C956C115" KeyPath="yes" Source="Synthec.dll" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32\1.0.0.0" Name="Class" Value="Synthec.SynthecHandler" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32\1.0.0.0" Name="Assembly" Value="Synthec, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filAEDB64435A66D04AC60E3377C956C115]" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32" Name="Class" Value="Synthec.SynthecHandler" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32" Name="Assembly" Value="Synthec, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
            <RegistryValue Root="HKCR" Key="CLSID\{97B04EDD-D0FC-4429-98FE-8D942E31CA98}\InprocServer32" Name="CodeBase" Value="file:///[#filAEDB64435A66D04AC60E3377C956C115]" Type="string" Action="write" />
        </Component>

对于tlb:

<Component Id="cmpB02C4AD21F21B1B50A662E8F59126370" Guid="ADBDF57B-8E1E-433D-B047-867DC71D5FB8">
            <File Id="filB2F5CE36C4E03293677DE32B903A3DC7" KeyPath="yes" Source="mydll.tlb">
                <TypeLib Id="{E7864806-81DA-46AC-881B-A5255CAE2D2E}" Description="Synthec" Language="0" MajorVersion="1" MinorVersion="0">
                    <Interface Id="{E31D9546-8BCC-4CA1-8B95-21EB6EFC0808}" Name="ISynthecHandler" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
                </TypeLib>
            </File>
        </Component>

所以dll组件本身没有接口项。。。我该怎么办

结果: 为了查看引用,需要tlb

要通过Visual Studio自动创建tlb,您应该选中“注册COM互操作”复选框,并以管理员身份运行Visual Studio

为了自动获取tlb,我(使用msbuild复制任务)将dll和tlb复制到单独的目录中(在创建dll的项目构建之后),然后按照回答中的建议使用heat任务(安装程序项目,构建之前),然后在我的主wxs(默认情况下为Product.wxs)文件中引用生成的wxs(实际上是其中的componentgroup)

此外,还应将生成的wxs添加到安装程序项目中,以便主wxs看到(因此,第一次出现关于componentgroupref的错误时,未找到)。但是,该文件的内容将由heat任务自动更新

所以,需要进行一些额外的调整,但这样我只需重新构建解决方案,并使用新的DLL获得全新的安装程序。此外,这个安装程序能够注册相当不错


希望这会对其他人有所帮助。

我以前使用msbuild为C#DLL提供了注册表信息,没有任何问题。以下是我如何使用msbuild执行此操作的示例:

<HeatFile OutputFile="ExactaDatabaseAccess.wxs" 
          File="..\ExactaMobilePublish\bin\ExactaDatabaseAccess.dll" 
          DirectoryRefId="MOBILEBIN" 
          ComponentGroupName="ExactaDatabaseAccess" 
          SuppressUniqueIds="true" 
          SuppressCom="false" 
          SuppressFragments="true" 
          SuppressRegistry="false" 
          SuppressRootDirectory="true" 
          AutoGenerateGuids="false" 
          GenerateGuidsNow="true" 
          ToolPath="$(WixToolPath)" 
          PreprocessorVariable="var.ExactaMobileBinBasePath" />

我想我也应该在msbuild上试试。到目前为止,我一直在使用来自cmd的wix3.8。如果有用的话,我会检查一下,谢谢@Empus仅供参考,我发布了与上述相同的热量命令。在使用msbuild命令时,它实际上会在visual studio输出窗口中向您显示它。缺少的不是COM类注册,似乎缺少\接口项,这意味着您的wxs文件中没有typelib注册。很抱歉离开一会儿。我最后尝试使用msbuild,但dll根本没有注册-VBA看不到它。这里它说应该出现某些注册表值,但我检查了注册表-它没有(即使在运行regasm之后也没有)。然而,在运行regasm之后,VBA开始看到dll非常正常。
C:\Program Files (x86)\WiX Toolset v3.8\bin\Heat.exe file ..\ExactaMobilePublish\bin\ExactaDatabaseAccess.dll -cg ExactaDatabaseAccess -dr MOBILEBIN -srd -var var.ExactaMobileBinBasePath -gg -sfrag -suid -out ExactaDatabaseAccess.wxs