Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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
如何自动更新.NET项目COM引用?_.net_Com_Build_Msbuild 4.0_Project Reference - Fatal编程技术网

如何自动更新.NET项目COM引用?

如何自动更新.NET项目COM引用?,.net,com,build,msbuild-4.0,project-reference,.net,Com,Build,Msbuild 4.0,Project Reference,我有一个遗留的VB6 COM DLL,它作为引用包含在.NET项目中。我的手动生成过程如下所示: 构建VB6动态链接库 将VB6 DLL复制到引用目录 使用regsvr32 在.NET项目中,删除旧引用 添加对新VB6 DLL的引用(浏览) 将引用的隔离属性设置为True 构建.NET解决方案 我正在使这个过程自动化。步骤4到步骤6给我带来了麻烦。注册新的VB6 COM DLL时,.NET项目中的旧引用无效。通过查看项目文件,我看到: <ItemGroup> <COMRef

我有一个遗留的VB6 COM DLL,它作为引用包含在.NET项目中。我的手动生成过程如下所示:

  • 构建VB6动态链接库
  • 将VB6 DLL复制到引用目录
  • 使用
    regsvr32
  • 在.NET项目中,删除旧引用
  • 添加对新VB6 DLL的引用(浏览)
  • 将引用的隔离属性设置为True
  • 构建.NET解决方案
  • 我正在使这个过程自动化。步骤4到步骤6给我带来了麻烦。注册新的VB6 COM DLL时,.NET项目中的旧引用无效。通过查看项目文件,我看到:

    <ItemGroup>
      <COMReference Include="DllName">
        <Guid>{65CDCC83-E707-4AA3-8940-FE79F265D570}</Guid>
        <VersionMajor>50</VersionMajor>
        <VersionMinor>0</VersionMinor>
        <Lcid>0</Lcid>
        <WrapperTool>tlbimp</WrapperTool>
        <Isolated>True</Isolated>
        <EmbedInteropTypes>True</EmbedInteropTypes>
      </COMReference>
    </ItemGroup>
    
    
    {65CDCC83-E707-4AA3-8940-FE79F265D570}
    50
    0
    0
    tlbimp
    真的
    真的
    
    我认为我需要使用COM的新clsid自动覆盖
    Guid
    属性,并且我可能需要更改
    VersionMajor
    VersionMinor
    属性

    不幸的是,这些似乎不是VB6 COM DLL文件的属性。我在哪里可以获得这些信息和/或我是否走上了正确的道路?是否有一些工具或选项可以自动为我做到这一点

    编辑

    如果不更新引用,则生成错误为error

    错误消息的实际文本为:

    c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(2580,9):错误MSB3179:隔离COM引用“DllName”时出现问题:未检测到此组件的注册类。[path/to/projfile.vbproj]


    。。。其中“DllName”是我的DLL名称,“path/to/projfile.vbproj”是带有COM引用的项目文件的完全限定路径。

    我没有尝试过这一点,但您可以通过显式使用tlbimp生成互操作程序集来实现,而不是让Visual Studio通过向COM DLL添加引用来为您完成这一操作

    比如:

  • 构建VB6动态链接库
  • 将VB6 DLL复制到引用目录
  • 运行tlbimp(例如,从批处理文件)以在引用目录中生成互操作程序集
  • NET项目应该在步骤3中引用互操作程序集输出
  • 构建.NET解决方案
  • 使用您的方法,我不再使用免注册COM


    我对Reg free COM没有太多经验,但也许您可以使用命令行工具手动生成清单,而不是设置隔离属性-例如,使用中描述的MT.EXE工具。

    我认为如果不使用vb6二进制兼容性选项,您无法解决此问题,因此guid保持稳定。@HansPassant-是,我现在将DLL设置为二进制兼容性,并且看到Guid和版本保持不变。但是,在生成解决方案时,我仍然收到MSB3179错误。错误消息的实际文本是什么?@HansPassant-我在问题的末尾添加了错误消息的全文。谢谢。听起来好像regsvr32.exe没有完成这项工作。您是否从提升的命令提示符运行它,以便它可以访问注册表?我一直在尝试。它在dev机器上工作,但在发布之后不工作(我使用的是ClickOnce)。使用您的方法,我不再在部署中使用免注册COM(这就是隔离属性所做的)。如果我自己在没有注册COM dll的情况下生成互操作,则隔离属性不可用。我想这就是答案,但我似乎无法让它工作。部分原因是对reg free COM缺乏了解。我让Visual Studio为我做所有的工作,这是在作弊