我刚刚完成了将一堆 C# 项目从 Visual Studio 2008 重组和升级到 Visual Studio 2010 的工作。此外,所有项目都更改为以 .NET 4.0 运行时为目标。一切都成功构建,但是,我现在收到一堆与我的应用程序所依赖的 COM 引用相关的警告。下面是警告之一。每次构建解决方案时,我都会收到将近 100 条类似于以下警告的警告。
Warning 60 Type library importer encountered a property getter 'ClearTopCardQue' on type 'FuelDirectOLETLB.FuelDirectOLE' without a valid return type. The importer will attempt to import this property as a method instead. c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets 1558 9 FDServer
我已调用编写我引用的对象的第 3 方供应商,但无济于事。他们建议我确保我的目标是 x86。他们还表示我应该能够针对任何版本的 .NET 运行时构建我的项目。就我个人而言,我怀疑这与我在 Visual Studio 2010/.NET Runtime 4.0 中引用版本 1 类型库有关,而在我构建 VS 2008/.NET Runtime 3.5 之前。我已经尝试针对所有构建配置(即 x86、x64、任何 Cpu)进行构建,并尝试将运行时的每个版本恢复到 2.0。这些警告令我担心,因为我不确定它们表示什么。有人可以提出任何建议/建议来帮助我找到这些警告的原因吗?
最佳答案
这是一个良性警告,无需担心。他们只是没有正确编写组件的 IDL。 COM 中的属性 getter 是方法,就像它们在 .NET 中一样。该方法必须具有正确的签名和属性才能被视为可以直接转换为 .NET 属性的有效属性。
这有时是笨手笨脚的。 Windows Media Player 就是一个很好的例子。从临时目录中的 Visual Studio 命令提示符运行此命令:
Tlbimp.exe c:\windows\system32\wmp.dll
你会看到:
TlbImp : warning TI0000 : Type library importer encountered a property getter 'sessionPlaylistCount' on type 'WMPLib.IWMPNowPlayingHelperDispatch' without a valid return type. The importer will attempt to import this property as a method instead.
Type library imported to WMPLib.dll
下一个类型:
Oleview.exe c:\windows\system32\wmp.dll
将类型库反编译回 IDL。在右 Pane 中选择文本并将其复制/粘贴到文本编辑器中。找到“sessionPlaylistCount”,您会看到:
[id(0x00000ba3), propget]
HRESULT sessionPlaylistCount([out] long* pVal);
当您将它与其他属性进行比较时,您会发现错误,它们忘记了 [retval] 属性。
这不是问题,因为 Tlbimp.exe 只会使它成为一个方法而不是一个属性。您将编写 get_sessionPlaylistCount(out count)
来使用损坏的属性。这很不方便,因为语法很笨拙,但不是问题。
关于c# - 与 COM 引用(版本 1.0 类型库)和 VS 2010 相关的生成警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15796731/