COM 개체 ActiveD 또는 MSXML2가 참조될 때 많은 빌드 경고가 발생함
-
06-07-2019 - |
문제
프로젝트를 .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'에 대한 인수 중 하나 이상을 마샬링할 수 없습니다.따라서 이러한 인수는 포인터로 전달되며 조작하려면 안전하지 않은 코드가 필요할 수 있습니다.
관찰:
- ActiveD(경고 11개) 및 MSXML2(경고 54개)에 대해 발생합니다.
- 우리 자신의 COM 개체에는 표시되지 않습니다.
<Reference>
.csproj 파일의 항목에 속성이 포함되어 있습니다.WrapperTool = "tlbimp"
- 모든 경고에도 불구하고 실행 중인 시스템에서는 아무런 문제도 발견되지 않았습니다.
경고를 제거하는 방법을 아시나요?
해결책
의 의견에 따르면 2.0에 대한 tlbimp에 관한 MDSN 기사, 당신은 tlbimp를 직접 실행하는이 문제를 해결할 수 없습니다.
Vs를 사용하여 문제를 재현하기가 쉬웠습니다. 또한 vs 댓글 프롬프트에서 tlbimp를 수동으로 실행하는 것도 재현했습니다.
tlbimp c:\WINNT\system32\activeds.tlb /out:interop.activeds.dll
수정은 /사일런트 스위치를 사용하는 것이 었습니다
tlbimp c:\WINNT\system32\activeds.tlb /silent /out:interop.activeds.dll
MSDN 기사의 의견에서 지적한 바와 같이, COM 참조는 직접 만든 Interop 어셈블리에 대한 .NET 어셈블리 참조가됩니다.
저는 전문가가 아니지만 프로젝트에 사전 빌드를 추가 하여이 작업을 수행했습니다.
"$(DevEnvDir)\..\..\SDK\v2.0\bin\tlbimp" c:\WINNT\system32\activeds.tlb
/namespace:ActiveDs /silent /out:"$(ProjectDir)interop.activeds.dll"
한 번 빌드하여 검색 탭과 함께 참조를 추가 할 DLL이 있습니다. 내 프로젝트 루트에 interop.activeds.dll에 대한 참조를 추가 한 다음 다시 만들었습니다. C ++ 프로젝트를 통한 외부 제작 파일과 같이 다른 방법 으로이 작업을 수행 할 수 있습니다. 이것은 POC에 더 가깝습니다.
MSBuild vs vs, $ (devenvdir)의 재미있는 차이점은 후행 백 슬래시가 있지만 MSBuild는 그렇지 않습니다.
다른 팁
나는 여기에서 제안에 따라 프로젝트 파일 (.csproj)을 편집하여 같은 문제를 경험하고 수정했습니다.
각 빌드 구성의 속성 그룹에 다음 키를 추가했습니다.
<ResolveComReferenceSilent>True</ResolveComReferenceSilent>
다음을 사용하여 경고를 중지할 수 있습니다.
#pragma warning disable warning-list #pragma warning restore warning-list
여기서 경고 목록은 쉼표로 구분된 경고 번호 목록입니다.
경고는 가져오는 Typelib에 관리 코드로 변환할 수 없는 내용이 포함되어 있지만 안전하지 않은 코드 블록에서 포인터 작업을 사용하여 처리할 수 있음을 의미합니다.코드는 .Net 1.1에서도 번역할 수 없었지만 컴파일러는 경고하는 방법 중 하나를 사용할 경우 발생할 수 있는 함정에 대해 경고할 만큼 똑똑하지 않았습니다.