12

将项目从 .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”的至少一个参数。因此,此类参数将作为指针传递,并且可能需要不安全的代码来操作。

观察:

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

知道如何摆脱警告吗?

4

3 回答 3

14

我遇到了同样的问题,并通过编辑项目文件(.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>
于 2015-10-19T11:40:53.080 回答
6

根据MDSN 文章中关于 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 没有。

于 2009-09-10T00:29:27.800 回答
-2

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

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

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

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

于 2009-08-22T03:12:30.197 回答