De nombreux avertissements de construction lorsque des objets COM ActiveDs ou MSXML2 sont référencés

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

Question

Après avoir déplacé un projet de .NET 1.1 vers .NET 2.0, MsBuild émet de nombreux avertissements pour certains objets COM.

Exemple de code pour le test (le code réel n'a pas d'importance, il est simplement utilisé pour créer les avertissements):

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

Les messages d'avertissement ressemblent à

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: warning: Au moins un des arguments de 'ITypeLib.RemoteGetLibAttr' ne peut pas être marshalé par le marshaler d'exécution. De tels arguments seront donc passés en tant que pointeur et nécessiteront peut-être un code peu sûr à manipuler.

Observations:

  • Se produit pour ActiveDs (11 avertissements) et MSXML2 (54 avertissements).
  • Non visible pour nos propres objets COM.
  • <Reference> l'entrée dans le fichier .csproj contient l'attribut WrapperTool = "tlbimp"
  • Malgré tous les avertissements, aucun problème n'a été observé dans le système en cours d'exécution.

Avez-vous une idée de la façon de vous débarrasser des avertissements?

Était-ce utile?

La solution

Selon un commentaire de article de MDSN sur TLBIMP pour 2.0 , vous ne pouvez pas résoudre ce problème sans exécuter TLBIMP vous-même.

Il était facile de reproduire votre problème avec VS. Je l’ai également reproduite manuellement en exécutant TLBIMP à partir d’une invite de commentaire VS:

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

Le correctif consistait à utiliser le commutateur / silent

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

Comme indiqué dans le commentaire de l'article MSDN, la référence COM devient une référence d'assembly .net à l'assembly d'interopérabilité que vous avez créé vous-même.

Je ne suis pas un expert en VS, mais j’ai réalisé ce travail en ajoutant un pré-construction au projet de:

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

Construit une fois pour que j'aie une dll pour ajouter une référence avec l'onglet Parcourir. Ajout d'une référence à interop.activeds.dll dans la racine de mon projet, puis à nouveau construit. Vous souhaiterez peut-être procéder de cette manière, par exemple avec un fichier make externe via un projet C ++. C’est plus un POC.

Notez une différence amusante entre MSBUILD et VS. $ (DevEnvDir) comporte une barre oblique inversée, mais pas MSBUILD.

Autres conseils

J'ai rencontré le même problème et je l'ai corrigé en modifiant le fichier de projet (.csproj), en suivant une suggestion proposée ici:

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

J'ai ajouté la clé suivante au groupe de propriétés de chaque configuration de construction:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

Vous pouvez arrêter les avertissements avec:

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

où liste d'avertissement est une liste de numéros d'avertissement séparée par des virgules.

L'avertissement signifie que la bibliothèque de types que vous importez contient un élément intraduisible en code managé mais peut être traitée à l'aide d'opérations de pointeur, dans un bloc de code non sécurisé. Le code était également intraduisible dans .Net 1.1, mais le compilateur n’était pas assez intelligent pour vous avertir du piège dans lequel vous pourriez tomber si vous utilisiez l’une des méthodes pour lesquelles il vous avertit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top