从C#为VB注册dll:Regasm工作,WiX不工作:运行时430
我在C#中创建了一个dll。它有一个带有guid和staff的接口,以便在Excel VB中支持intellisense。当我自动注册它(在MSV中选中几个复选框)或使用regasm mydll.dll/tlb:mydll.dll时,它工作正常 但是我想使用WiX将它与我的程序的其余部分一起自动部署。 我使用了这里描述的热量 引述:从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
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