Reg Free COM - 隔离 COM 参考 - 缺失值“(默认)”

Posted

技术标签:

【中文标题】Reg Free COM - 隔离 COM 参考 - 缺失值“(默认)”【英文标题】:Reg Free COM - Isolating COM Reference - missing value '(Default)' 【发布时间】:2010-12-07 04:19:11 【问题描述】:

所以我的 .NET 3.5 程序集库引用了一个免注册的 VB6 DLL,最终由 .NET 3.5 WinForms 应用程序引用(不确定它是否相关,但包含用于绘制图片)。

我收到错误“隔离 COM 引用“SomeVBDll”的问题:Registry key 'HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID\dd1d7f58-1d6b-4370-a1b9-05c03816a128\InProcServer32' is missing value '(Default)'

我最初的尝试是检查该值是否确实存在,然后将其放置到位。这导致编译时出现上述相同的消息。

有没有人遇到过这个问题并知道解决办法?

提前致谢。下面是直接引用 VB6 dll 的程序集的清单。

    <assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity name="Native.App.Core" version="1.0.0.0" type="win32" />
  <file name="SomeVBDll.dll" asmv2:size="184320">
    <hash xmlns="urn:schemas-microsoft-com:asm.v2">
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>BWWHQTqNGUupT8xznLoN3jn7S9Y=</dsig:DigestValue>
    </hash>
    <typelib tlbid="755c1df5-d0c5-4e10-a93d-54bf186e8daf" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
    <comClass clsid="dd1d7f58-1d6b-4370-a1b9-05c03816a128" threadingModel="Apartment" tlbid="755c1df5-d0c5-4e10-a93d-54bf186e8daf" progid="SomeVBDll.MyClass" />
  </file>
</assembly>

编辑///

将 VB6 DLL 中的所有类标记为 MultiUse 似乎已经解决了这个问题。 虽然这解决了我遇到的问题并且仍然允许我使用无注册 COM,但有没有人知道一种方法可以解决必须将所有 COM 类 Instancing 设置为 MultiUse 的问题?

【问题讨论】:

此线程 [tech-archive.net/Archive/DotNet/… 表示问题可能与 VB6 dll 中的某些类的实例化标记为私有有关。这也是我的情况,我有一个 MultiUse(非私有)类,其余的都是私有的。我宁愿不将其他人标记为 MultiUse,但我会这样做以查看实际上是否可以解决问题.... 好的,所以 MultiUse 似乎只是一个临时修复,并不是真正的潜在问题。我现在遇到了与我原来的帖子中提到的相同的问题。我在 Windows Vista Ultimate x64 上以非管理员身份运行,在 Visual Studio 2008 中以非管理员身份构建项目。 对于 COM DLL 中定义的每个类,它似乎都报告了上述错误。我已验证每个类都标记为 MultiUse。 仅供未来的读者阅读 - 我认为这个具有类似错误消息的另一个问题是另一个问题的结果:***.com/questions/8914138/… 【参考方案1】:

我见过的唯一解决方案(如果您想避免将所有类标记为 MultiUse 可能出现的安全/维护问题)是删除“.../InProcServer32”注册表项,但解决方法是标准的“小心弄乱注册表”警告。

【讨论】:

即使在构建过程中删除 /InProcServer32 键也不能解决我的问题。如果我能做到这一点,我会没事的,但即使我删除了这些键,我仍然会收到错误。【参考方案2】:

当标记为私有 VB6 COM 类时,不为 Inproc32 注册值,并且 Visual Studio 生成的程序集清单不完整。有一些工具,例如 Make my Manifest http://mmm4vb6.atom5.com/,可以帮助您为组件创建清单

【讨论】:

所以即使我在我的 VB6 dll MultiUse 中标记了每种类型,你认为我仍然可能有一个明显的问题吗?当我有时间看看这是否有帮助时,我会看看 MMM。感谢发帖。

以上是关于Reg Free COM - 隔离 COM 参考 - 缺失值“(默认)”的主要内容,如果未能解决你的问题,请参考以下文章

登陆163邮箱总显示访问URL:reg.163.com被管理员阻止怎么办?

new与malloc以及free store与heap|搬运理解与整理

reg命令怎么用

new/delete与malloc/free的区别

Mysql ACID与隔离级别

SQL Server 事务隔离级别