如何在.NET项目中使用COM引用来抑制编译器警告

时间:2009-07-20 08:26:35

标签: c# interop marshalling

我们使用Windows COM +服务类型库(位于C:\ Windows \ system32 \ COMSVCS.dll)使用C#3.0 / .NET 3.5编写的服务跟踪远程计算机上的COM +进程。我遇到的问题是我从编译器中得到了一大堆警告,如下所示:

  

至少有一个论点   'IGetAppData.GetApps'不可能   由运行时封送器封送。   因此,这些论点将是   作为指针传递,可能需要   操纵不安全的代码。

上述方法生成的互操作函数签名是:

void IGetAppData.GetApps(out uint nApps, IntPtr aAppData)

由于输出已经在调用代码中手动编组(即使用Marshall.ReadInt32Marshall.PtrToStructure),是否有办法抑制这些类型的警告?

5 个答案:

答案 0 :(得分:4)

在项目文件的第一个属性组中添加此行:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

答案 1 :(得分:2)

由于该警告没有数字,您无法使用#pragma来抑制它,但您可以使用tlbimp在Visual Studio外部导入dll并使用生成的引用,而不是让Visual Studio创建它。

答案 2 :(得分:1)

您可以尝试使用经过大幅改进,可自定义的Type Library Importer in Managed Code来自定义方法签名。然后引用此包装器而不是项目中的原始COM库。

答案 3 :(得分:0)

我能够通过将引用指向Interop.xxxx.dll而不是主dll来解决这个问题。在我的情况下使用Interop.TaskScheduler.dll工作,而taskschd.dll给我警告。我使用Rebuild All进行了验证,警告消失了。

答案 4 :(得分:-1)

如果您只想隐藏警告,则可以使用#pragma warning指令。这允许您有选择地启用/禁用特定警告。