2008-11-06 8 views
9

Después de mover un proyecto de .NET 1.1 a .NET 2.0, MsBuild emite muchas advertencias para algunos objetos COM.Muchas advertencias de compilación cuando se hace referencia a objetos COM ActiveDs o MSXML2

Código de la muestra para la prueba (código real no importa, sólo se utiliza 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:

  • sucede por Activeds (11 cuidado) y MSXML2 (54 advertencias).
  • No se ha visto para nuestros propios objetos COM.
  • <Reference> entrada en el fichero contiene .csproj atributo WrapperTool = "tlbimp"
  • A pesar de todas las advertencias, no se han observado problemas en el sistema en funcionamiento.

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

+0

¿Alguna vez se las arreglaron para resolver esto? – Mario

+0

Lamentablemente, no. – gyrolf

Respuesta

6

Según un comentario en el MDSN article about TLBIMP for 2.0, no puede solucionar este problema sin ejecutar TLBIMP usted mismo.

Fue fácil reproducir su problema usando VS. También reproduje funcionando TLBIMP manualmente desde una línea de comentario VS:

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

La solución fue utilizar el modificador/silencio

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 del conjunto .net al conjunto de interoperabilidad que construyó usted mismo.

No soy un experto en VS, pero hice este trabajo mediante la adición de un prebuild al proyecto de:

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

incorporado una vez por lo que tendría un DLL para agregar una referencia a la ficha Examinar . 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 make externo a través de un proyecto 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.

-2

Puede detener las advertencias con:

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

en la lista de alerta es una lista separados por comas de los números de aviso.

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.

+2

¡Desactivar las advertencias mediante #pragma no funciona porque el mensaje de advertencia no contiene ningún número de advertencia! La advertencia no es creada por el compilador. Probablemente es creado por TlbImp. – gyrolf

9

que había experimentado el mismo problema y lo arreglaron mediante la edición del archivo de 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

que añade la siguiente clave para el grupo de propiedades de cada generación configuración:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent> 
+1

Brillante, esto funcionó sin tener que usar TLBIMP. –

Cuestiones relacionadas