4

我最近将我的一个 C# 解决方案从 VS2008 更新到 vs 2010 以利用嵌入式互操作类型功能,这样我就可以停止交付我们目前由于与旧版 VB6 代码库交互而必须使用的互操作库。

出于某种原因,我在编译解决方案时收到以下消息:

类型库导入器遇到了一个不是从 IUnknown 派生的接口:'_HiddenInterface'

我已经四处搜索,到目前为止,我能找到的唯一两条信息是“忽略它不会造成任何伤害”和“这意味着 VB6 代码违反了一些规则”。由于 VB 代码库是我们的,最好在编译时出现 0 个警告,我想纠正导致这些警告的任何原因。

我很茫然,所以任何建议都会很棒。

4

2 回答 2

2

如果您引用了一个 COM 库,该库包含一个具有返回 VB 集合对象的公共方法的类,您将收到编译器警告。

_HiddenInterface 接口包含在 MSVBVM60.DLL 中。您可以通过打开 OLE 视图并导航到Type Libraries > Visual Basic for Applications (Ver 6.0)来查看这一点。双击 typelib 以打开 ITypeLib Viewer 窗口。你可以interface _HiddenInterface在列表中看到。

您应该能够使用这些函数返回的集合,尽管您无法在 .NET 中创建集合的实例,如 Microsoft 知识库文章BUG: Error message when you try to pass a Collection object from Visual Basic 6.0 components to Visual Basic 2005 或 Visual Basic .NET:“System.InvalidCastException”

于 2013-12-10T04:28:19.780 回答
0

这是我发现可以抑制此警告的方法,主要基于此处的评论:https ://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off -msbuild-warnings-msb3305?forum=msbuild

IanG 发布的相关详情:

虽然一般来说,修复潜在问题是修复警告的最佳方法,但当潜在的“问题”是 Microsoft 提供的构建工具不喜欢 Microsoft 提供的库时,这是不可能的。

...

这里的困难在于,MSBuild 在这里确定的“问题”根本不是真正的问题。它只是告诉我们导入的库包含一些功能,如果您选择使用它们,在 .NET 世界中会出现问题。不幸的是,即使您的代码没有使用任何有问题的位,它也会生成这些警告。在导入未考虑 .NET 设计的类型库时,这是完全正常的。只要您的 C# 代码从不尝试使用这些功能,您就可以了。

...

我找到了一种阻止警告出现的方法,但我不确定它有多可靠,因为它使用了一个我没有找到任何直接文档的功能,以及我发现的唯一相关的东西带有此警告:“此 API 支持 .NET Framework 基础结构,不打算直接从您的代码中使用。”

我已将其添加到 .csproj 文件顶部的 PropertyGroup 中:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

我无法直接找到此文档,但查看 SDK 中的目标文件,您会发现这会影响以下属性:http: //msdn.microsoft.com/en-us/library/microsoft。 build.tasks.resolvecomreference.silent(v=vs.110).aspx 但这是一个警告,这是供内部使用的。

也就是说,我没有直接使用不受支持的设置:我通过这个属性使用它。虽然我没有找到任何关于该房产本身的文档,但至少有一页告诉您有关该房产的信息。虽然它是针对一种完全不同的项目, 但http://msdn.microsoft.com/en-us/library/windows/hardware/jj659905(v=vs.85).aspx 确实建议使用它来删除来自COM 参考。

其中一个链接将您带到在 UWP 应用程序和桌面应用程序之间共享编译的二进制文件,简洁地说:

如果您看到 COM 引用导致的警告,请将以下内容添加到<PropertyGroup>标记中:

<ResolveComReferenceSilent>true</ResolveComReferenceSilent>

即使这是特定于 UWP 的信息,它似乎在非 UWP 项目中也能正常工作。

为了在我自己的项目中实现这一点,我在文件的现有部分PropertyGroup下方添加了一个新的:COMReferenceCSPROJ

  <ItemGroup>
    <COMReference Include="SomeVB6Library">
      <Guid>{.......}</Guid>
      <VersionMajor>1</VersionMajor>
      <VersionMinor>0</VersionMinor>
      <Lcid>0</Lcid>
      <WrapperTool>tlbimp</WrapperTool>
      <Isolated>False</Isolated>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </COMReference>
  </ItemGroup>

  <PropertyGroup>
    <!-- ResolveComReferenceSilent is to remove warning MSB3305 -->
    <ResolveComReferenceSilent>true</ResolveComReferenceSilent>
  </PropertyGroup>

请注意,无论出于何种原因,我每次构建库时都没有看到生成的警告,只是有时。但是,每当我清理并重建整个解决方案时,它似乎总是会出现。直到我意识到我不相信这是否按预期工作。但它似乎做到了。

我不确定这是否会产生任何其他不良影响 - 例如抑制您可能实际需要查看的其他警告。我会仔细测试。

于 2021-11-03T15:44:59.080 回答