.net - Muchas advertencias de compilación cuando se hace referencia a los objetos COM ActiveDs o MSXML2
msbuild com-interop (3)
Puedes 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 lista de tipos que está importando contiene algo intraducible en el código administrado, pero podría tratarse con operaciones de puntero, en un bloque de código inseguro. El código no se puede traducir en .Net 1.1 también, pero el compilador no fue lo suficientemente inteligente como para advertirle acerca de la trampa en la que podría entrar si utiliza uno de los métodos que le advierte.
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 ven como
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 marcador de tiempo de ejecución. Por lo tanto, dichos argumentos se pasarán como un puntero y pueden requerir la manipulación de un código inseguro.
Observaciones:
- Ocurre para ActiveDs (11 advertencias) y MSXML2 (54 advertencias).
- No se ve para nuestros propios objetos COM.
-
<Reference>
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?
De acuerdo con 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 de VS:
tlbimp c:/WINNT/system32/activeds.tlb /out:interop.activeds.dll
La solución era usar el modificador / silent
tlbimp c:/WINNT/system32/activeds.tlb /silent /out:interop.activeds.dll
Como se señala 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 usted mismo construyó.
No soy un experto en VS, pero hice esto al agregar un prebuild 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 mi raíz del proyecto y luego volví a construir. Es posible que desee hacer esto de otra manera, como con un archivo de marca externo a través de un proyecto de C ++. Esto es más de un POC.
Tenga en cuenta una diferencia divertida en MSBUILD vs VS, $ (DevEnvDir) tiene una barra diagonal inversa pero MSBUILD no.
Experimenté el mismo problema y lo solucioné editando el archivo de 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>