引用 COM 对象 ActiveD 或 MSXML2 时出现大量构建警告

Posted

技术标签:

【中文标题】引用 COM 对象 ActiveD 或 MSXML2 时出现大量构建警告【英文标题】:Lots of build warnings when COM objects ActiveDs or MSXML2 are referenced 【发布时间】:2010-09-21 02:37:09 【问题描述】:

将项目从 .NET 1.1 迁移到 .NET 2.0 后,MsBuild 会针对某些 COM 对象发出大量警告。

用于测试的示例代码(实际代码无关紧要,仅用于创建警告):

using System;
using System.DirectoryServices;
using ActiveDs;
namespace Test

    public class Class1
    
        public static void Main(string[] args)
        
            string adsPath = String.Format("WinNT://0/1", args[0], args[1]);
            DirectoryEntry localuser = new DirectoryEntry(adsPath);
            IADsUser pUser = (IADsUser) localuser.NativeObject;
            Console.WriteLine("User = 0", pUser.ADsPath);
        
    

警告信息看起来像

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets:警告:运行时封送处理程序无法封送“ITypeLib.RemoteGetLibAttr”的至少一个参数。因此,此类参数将作为指针传递,并且可能需要不安全的代码来操作。

观察:

发生在 ActiveD(11 条警告)和 MSXML2(54 条警告)中。 我们自己的 COM 对象看不到。 <Reference> .csproj 文件中的条目包含属性 WrapperTool = "tlbimp" 尽管有所有警告,但在运行的系统中未发现任何问题。

知道如何摆脱警告吗?

【问题讨论】:

你有没有设法解决这个问题? 相关:***.com/questions/13450058/…***.com/questions/22325870/…***.com/questions/6694236/… 【参考方案1】:

我遇到了同样的问题,并通过编辑项目文件 (.csproj) 来修复它,遵循这里的建议:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off-msbuild-warnings-msb3305?forum=msbuild

我在每个构建配置的属性组中添加了以下键:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

【讨论】:

太棒了,无需使用 TLBIMP。【参考方案2】:

根据MDSN article about TLBIMP for 2.0 中的评论,您无法在不自己运行 TLBIMP 的情况下解决此问题。

使用 VS 很容易重现您的问题。我还从 VS 注释提示中手动复制了它运行 TLBIMP:

   tlbimp c:\WINNT\system32\activeds.tlb /out:interop.activeds.dll

解决方法是使用 /silent 开关

   tlbimp c:\WINNT\system32\activeds.tlb /silent /out:interop.activeds.dll

正如 MSDN 文章中的评论所指出的,COM 引用变成了对您自己构建的互操作程序集的 .net 程序集引用。

我不是 VS 专家,但我通过向以下项目添加预构建来完成这项工作:

    "$(DevEnvDir)\..\..\SDK\v2.0\bin\tlbimp" c:\WINNT\system32\activeds.tlb
            /namespace:ActiveDs /silent /out:"$(ProjectDir)interop.activeds.dll"

构建一次,所以我有一个 dll 来添加浏览选项卡的引用。在我的项目根目录中添加了对 interop.activeds.dll 的引用,然后再次构建。您可能希望以其他方式执行此操作,例如通过 C++ 项目使用外部 make 文件。这更像是一个 POC。

请注意 MSBUILD 与 VS 的一个有趣区别,$(DevEnvDir) 有一个尾随反斜杠,但 MSBUILD 没有。

【讨论】:

【参考方案3】:

您可以通过以下方式停止警告:

#pragma 警告禁用警告列表 #pragma warning 恢复警告列表

其中警告列表是以逗号分隔的警告编号列表。

警告意味着您正在导入的类型库包含无法转换为托管代码的内容,但可以在不安全的代码块中使用指针操作来处理。该代码在 .Net 1.1 中也无法翻译,但编译器不够聪明,无法警告您如果使用它警告您的方法之一,您可能会陷入陷阱。

【讨论】:

通过#pragma 禁用警告不起作用,因为警告消息不包含警告编号!警告不是由编译器创建的。可能它是由 TlbImp 创建的。

以上是关于引用 COM 对象 ActiveD 或 MSXML2 时出现大量构建警告的主要内容,如果未能解决你的问题,请参考以下文章

vbscript 使用MSXML对象库创建XML

msxml4.0是啥软件

msxml4.0安装不了

一个vc中使用msxml的问题

XML引用外部实体触发XXE漏洞

asp怎样通过Msxml2.DOMDocument或Microsoft.XMLDOM模糊查找xml