Множество предупреждений о сборке, когда на объекты COM ссылаются ActiveD или MSXML2

После перемещения проекта из.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: warning: По крайней мере один из аргументов для 'ITypeLib.RemoteGetLibAttr' не может быть маршалирован маршалером во время выполнения. Поэтому такие аргументы будут передаваться как указатель, и для манипуляции может потребоваться небезопасный код.

Замечания:

  • Бывает для ActiveD (11 предупреждений) и MSXML2 (54 предупреждения).
  • Не видно для наших собственных объектов COM.
  • <Reference> запись в файле.csproj содержит атрибут WrapperTool = "tlbimp"
  • Несмотря на все предупреждения, никаких проблем не было замечено в работающей системе.

Есть идеи как избавиться от предупреждений?

3 ответа

Решение

Согласно комментарию в статье MDSN о TLBIMP для 2.0, вы не можете решить эту проблему без запуска TLBIMP самостоятельно.

Было легко воспроизвести вашу проблему, используя VS. Я также воспроизвел его, запустив TLBIMP вручную из подсказки комментария VS:

   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 в корне моего проекта, а затем собрал снова. Возможно, вы захотите сделать это другим способом, например, с помощью внешнего файла make через проект C++. Это больше POC.

Обратите внимание на забавную разницу в MSBUILD по сравнению с VS, $(DevEnvDir) имеет обратную косую черту, но MSBUILD нет.

Я столкнулся с той же проблемой и исправил ее, отредактировав файл проекта (.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>

Вы можете остановить предупреждения с помощью:

    #pragma warning отключить список предупреждений
    #pragma Warning восстановить список предупреждений

где список предупреждений - это разделенный запятыми список номеров предупреждений.

Предупреждение означает, что импортируемая библиотека типов содержит что-то непереводимое в управляемый код, но может быть обработано с помощью операций с указателями в блоке небезопасного кода. Код также был непереводим в.Net 1.1, но компилятор не был достаточно умен, чтобы предупредить вас о ловушке, в которую вы можете попасть, если вы используете один из методов, о которых он вас предупреждает.

Другие вопросы по тегам