Lotes de avisos de compilação quando objetos COM ActiveDS ou MSXML2 são referenciados

StackOverflow https://stackoverflow.com/questions/269063

Pergunta

Depois de mover um projeto de .NET 1.1 para .NET 2.0, MsBuild emite lotes de avisos para alguns objetos COM.

Exemplo de código para teste (código real não importa, apenas usado para criar os avisos):

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);
        }
    }
}

Mensagens de aviso parecer

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: warning: Pelo menos um dos argumentos para 'ITypeLib.RemoteGetLibAttr' não pode ser empacotado pelo empacotador de runtime. Tais argumentos, portanto, ser passado como um ponteiro e pode exigir código inseguro para manipular.

Observações:

  • acontece para ActiveDS (11 avisos) e MSXML2 (54 avisos).
  • Não visto para os nossos próprios objetos COM.
  • entrada <Reference> em .csproj contém atributo WrapperTool = "tlbimp"
  • Apesar de todos os avisos, sem problemas foram observados no sistema de execução.

Qualquer idéia de como se livrar das advertências?

Foi útil?

Solução

De acordo com um comentário no MDSN artigo sobre TLBIMP para 2.0 , você não pode corrigir este problema w / o correr TLBIMP si mesmo.

Foi fácil para reproduzir o problema usando VS. Eu também reproduzida-lo funcionando TLBIMP manualmente a partir de um comentário VS prompt:

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

A correção foi usar o parâmetro / silencioso

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

Como foi salientado no comentário no artigo do MSDN, a referência COM torna-se uma referência de assembly .net à interoperabilidade montagem que você construiu-se.

Eu não sou um especialista em VS, mas eu fiz este trabalho, adicionando um prebuild para projeto de:

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

Built-lo uma vez para que eu teria uma dll para adicionar uma referência com a guia de navegação. Adicionado uma referência ao interop.activeds.dll na minha raiz do projeto e, em seguida, construído de novo. Você pode querer fazer isso de outra maneira, como com um arquivo make externo através de um projeto C ++. Este é mais um POC.

Observe a diferença engraçado em MSBUILD vs VS, $ (DevEnvDir) tem uma barra invertida, mas MSBUILD não.

Outras dicas

eu tinha experimentado o mesmo problema e fixa-lo, editando o arquivo de projeto (.csproj), seguindo uma sugestão a partir daqui:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off-msbuild-warnings-msb3305?forum=msbuild

Eu adicionei o seguinte chave para o grupo de propriedades de cada configuração de compilação:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

Você pode parar os avisos com:

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

onde lista de advertência é uma lista separada por vírgulas de números de aviso.

Os meios de alerta que o typelib você está importando contém algo intraduzível em código gerenciado, mas pode ser tratada com o uso de operações de ponteiro, em um bloco de código inseguro. O código era intraduzível em .Net 1.1, bem como, mas o compilador não era inteligente o suficiente para avisá-lo sobre a armadilha que você pode entrar se você usar um dos métodos é que você aviso sobre.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top