Domanda

Dopo aver spostato un progetto da .NET 1.1 a .NET 2.0, MsBuild emette molti avvisi per alcuni oggetti COM.

Codice di esempio per il test (il codice effettivo non ha importanza, utilizzato solo per creare gli avvisi):

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

I messaggi di avviso sembrano

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets: avviso: almeno uno degli argomenti per "ITypeLib.RemoteGetLibAttr" non può essere eseguito il marshalling dal marshaller di runtime. Tali argomenti verranno pertanto passati come puntatore e potrebbero richiedere la manipolazione di codice non sicuro.

Osservazioni:

  • Succede per ActiveD (11 avvisi) e MSXML2 (54 avvisi).
  • Non visibile per i nostri oggetti COM.
  • <Reference> la voce nel file .csproj contiene l'attributo WrapperTool = "tlbimp"
  • Nonostante tutti gli avvertimenti, non sono stati osservati problemi nel sistema in esecuzione.

Qualche idea su come sbarazzarsi degli avvertimenti?

È stato utile?

Soluzione

Secondo un commento nell'articolo MDSN su TLBIMP per 2.0 , non puoi risolvere questo problema senza eseguire TLBIMP da solo.

È stato facile riprodurre il tuo problema usando VS. L'ho anche riprodotto eseguendo TLBIMP manualmente da un prompt dei commenti VS:

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

La correzione era usare l'opzione / silent

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

Come sottolineato nel commento nell'articolo MSDN, il riferimento COM diventa un riferimento di assembly .net all'assembly di interoperabilità creato dall'utente.

Non sono un esperto di VS, ma ho fatto questo lavoro aggiungendo un pre-build al progetto di:

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

L'ho costruito una volta, quindi avrei una dll per aggiungere un riferimento con la scheda Sfoglia. Aggiunto un riferimento a interop.activeds.dll nella radice del mio progetto e poi creato di nuovo. Potresti voler fare questo in un altro modo, come con un file make esterno tramite un progetto C ++. Questo è più di un POC.

Nota una divertente differenza in MSBUILD vs VS, $ (DevEnvDir) ha una barra rovesciata finale ma MSBUILD no.

Altri suggerimenti

Ho riscontrato lo stesso problema e risolto modificando il file di progetto (.csproj), seguendo un suggerimento da qui:

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

Ho aggiunto la seguente chiave al gruppo di proprietà di ciascuna configurazione di build:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>

Puoi interrompere gli avvisi con:

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

dove elenco avvisi è un elenco separato da virgole di numeri di avviso.

L'avvertimento indica che il typelib che stai importando contiene qualcosa di non traducibile nel codice gestito ma che potrebbe essere gestito usando le operazioni del puntatore, in un blocco di codice non sicuro. Il codice non era traducibile anche in .Net 1.1, ma il compilatore non era abbastanza intelligente da avvisarti della trappola in cui potresti imbatterti se usi uno dei metodi di cui ti sta avvisando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top