Muchas advertencias de compilación cuando se hace referencia a objetos COM ActiveDs o MSXML2

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

Pregunta

Después de mover un proyecto de .NET 1.1 a .NET 2.0, MsBuild emite muchas advertencias para algunos objetos COM.

Código de muestra para la prueba (el código real no importa, solo se usa para crear las advertencias):

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

Los mensajes de advertencia se parecen a

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: advertencia: al menos uno de los argumentos para 'ITypeLib.RemoteGetLibAttr' no puede ser ordenado por el calificador en tiempo de ejecución. Tales argumentos, por lo tanto, se pasarán como un puntero y pueden requerir código inseguro para manipular.

Observaciones:

  • sucede con ActiveDs (11 advertencias) y MSXML2 (54 advertencias).
  • No se ve para nuestros propios objetos COM.
  • La entrada
  • <Reference> en el archivo .csproj contiene el atributo WrapperTool = "tlbimp"
  • A pesar de todas las advertencias, no se han observado problemas en el sistema en ejecución.

¿Alguna idea de cómo deshacerse de las advertencias?

¿Fue útil?

Solución

Según un comentario en el artículo de MDSN sobre TLBIMP para 2.0 , no puede solucionar este problema sin ejecutar TLBIMP usted mismo.

Fue fácil reproducir su problema usando VS. También lo reproduje ejecutando TLBIMP manualmente desde un mensaje de comentario VS:

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

La solución fue usar el modificador / silent

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

Como se señaló en el comentario en el artículo de MSDN, la referencia COM se convierte en una referencia de ensamblado .net al ensamblado de interoperabilidad que creó usted mismo.

No soy un experto en VS, pero hice este trabajo agregando una precompilación al proyecto de:

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

Lo construí una vez, así que tendría un dll para agregar una referencia con la pestaña de exploración. Agregué una referencia a interop.activeds.dll en la raíz de mi proyecto y luego volví a compilar. Es posible que desee hacer esto de otra manera, como con un archivo de creación externo a través de un proyecto C ++. Esto es más un POC.

Observe una diferencia divertida en MSBUILD vs VS, $ (DevEnvDir) tiene una barra diagonal inversa pero MSBUILD no.

Otros consejos

Experimenté el mismo problema y lo solucioné editando el archivo del proyecto (.csproj), siguiendo una sugerencia de aquí:

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

Agregué la siguiente clave al grupo de propiedades de cada configuración de compilación:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

Puede detener las advertencias con:

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

donde la lista de advertencia es una lista separada por comas de números de advertencia.

La advertencia significa que la biblioteca de tipos que está importando contiene algo que no se puede traducir en el código administrado, pero que podría tratarse mediante operaciones de puntero, en un bloque de código inseguro. El código tampoco era traducible en .Net 1.1, pero el compilador no era lo suficientemente inteligente como para advertirle sobre la trampa a la que podría enfrentarse si usa uno de los métodos que le advierte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top