Множество предупреждений о сборке, когда на объекты 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), следуя предложенному ниже предложению:
Я добавил следующий ключ в группу свойств каждой конфигурации сборки:
<ResolveComReferenceSilent>True</ResolveComReferenceSilent>
Вы можете остановить предупреждения с помощью:
#pragma warning отключить список предупреждений #pragma Warning восстановить список предупреждений
где список предупреждений - это разделенный запятыми список номеров предупреждений.
Предупреждение означает, что импортируемая библиотека типов содержит что-то непереводимое в управляемый код, но может быть обработано с помощью операций с указателями в блоке небезопасного кода. Код также был непереводим в.Net 1.1, но компилятор не был достаточно умен, чтобы предупредить вас о ловушке, в которую вы можете попасть, если вы используете один из методов, о которых он вас предупреждает.