【问题标题】:Warning when using embedded Interop-Types使用嵌入式互操作类型时的警告
【发布时间】:2011-10-05 08:56:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 它似乎与 Visual Basic 类型与 VBA 类型有关。根据互联网,VBA 类型只能从 VB6 应用程序创建。

标签: .net com-interop tlbimp


【解决方案1】:

如果您引用了一个 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 or to Visual Basic .NET: "System.InvalidCastException" 中所述。

【讨论】:

  • 似乎那篇 MSFT 文章确实记录了两个不同的问题。我认为这只是与这个问题相关的 COMException 东西。
【解决方案2】:

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

IanG 发布的相关详情:

虽然一般来说,解决根本问题是解决问题的最佳方法 修复警告,当潜在的“问题”是 微软提供的构建工具不喜欢关于 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 中的虚假警告 参考。

其中一个链接会将您带到Sharing compiled binaries between UWP apps and Desktop apps,它简洁地说:

如果您看到 COM 引用导致的警告,请添加以下内容 到&lt;PropertyGroup&gt; 标签:

<ResolveComReferenceSilent>true</ResolveComReferenceSilent>

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

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

  <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>

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2018-06-10
    • 2011-01-29
    • 2012-02-27
    • 2023-03-04
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多