문제

프로젝트를 .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)을 편집하여 같은 문제를 경험하고 수정했습니다.

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

여기서 경고 목록은 쉼표로 구분된 경고 번호 목록입니다.

경고는 가져오는 Typelib에 관리 코드로 변환할 수 없는 내용이 포함되어 있지만 안전하지 않은 코드 블록에서 포인터 작업을 사용하여 처리할 수 있음을 의미합니다.코드는 .Net 1.1에서도 번역할 수 없었지만 컴파일러는 경고하는 방법 중 하나를 사용할 경우 발생할 수 있는 함정에 대해 경고할 만큼 똑똑하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top