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

После перемещения проекта из .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 ]

12 голосов
/ 19 октября 2015

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

Согласно комментарию в статье 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 нет.

0 голосов
/ 22 августа 2009

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

    #pragma warning disable warning-list
    #pragma warning restore warning-list

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

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

...