Muchas advertencias de compilación cuando se hace referencia a objetos COM ActiveDs o MSXML2
-
06-07-2019 - |
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 atributoWrapperTool = "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?
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í:
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.