Множество предупреждений о сборке при ссылках на COM-объекты ActiveDs или 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:WINDOWSMicrosoft.NETFrameworkv2.0.50727Microsoft.Common.targets : предупреждение: по крайней мере, один из аргументов для 'ITypeLib.RemoteGetLibAttr' не может быть передан во время маршалинга. Такие поэтому аргументы будут переданы как указатель и могут потребовать небезопасного кода для управления.

замечания:

  • происходит для ActiveDs (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 switch

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

как указано в комментарии в статье MSDN, ссылка COM становится ссылкой на сборку .net для взаимодействия сборку вы построили сами.

Я не эксперт VS, но я сделал эту работу, добавив prebuild в проект:

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

построил его один раз, чтобы у меня была dll, чтобы добавить ссылку с вкладкой обзора. Добавлена ссылка на взаимодействие.activeds.dll в моем корне проекта, а затем снова построен. Вы можете сделать это каким-то другим способом, например, с помощью внешнего файла make через проект C++. Это скорее POC.

обратите внимание на забавную разницу в MSBUILD vs VS, $(Девенвдир) имеет обратную косую черту, но 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 disable warning-list
    #pragma warning restore warning-list

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

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