Procedura: registrare e configurare un moniker servizio
Per usare il moniker del servizio WCF (Windows Communication Foundation) all'interno di un'applicazione COM con un contratto tipizzato, è necessario registrare i tipi con attributi necessari con COM e configurare l'applicazione COM e il moniker con la configurazione del binding necessaria.
Registrare i tipi con attributi necessari con COM
Usare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) per recuperare il contratto di metadati dal servizio WCF. Questo genera il codice sorgente per un assembly client WCF e un file di configurazione dell'applicazione client.
Assicurarsi che i tipi nell'assembly siano contrassegnati come
ComVisible
. A tale scopo, aggiungere l'attributo seguente al file AssemblyInfo.cs nel progetto di Visual Studio.[assembly: ComVisible(true)]
Compilare il client WCF gestito come assembly con nome sicuro. Ciò richiede una firma con una coppia di chiavi di crittografia. Per altre informazioni, vedere Firma di un assembly con un nome sicuro.
Usare lo strumento di registrazione degli assembly (Regasm.exe) con l'opzione
-tlb
, per registrare i tipi nell'assembly con COM.Usare lo strumento della cache di assembly globale (Gacutil.exe) per aggiungere l'assembly alla cache di assembly globale.
Nota
La firma e l'aggiunta dell'assembly alla cache di assembly globale sono passaggi facoltativi, che possono però semplificare il processo di caricamento dell'assembly dal percorso corretto in fase di esecuzione.
Configurare l'applicazione COM e il moniker con la configurazione del binding necessaria
Inserire le definizioni di binding (generate dal ServiceModel Metadata Utility Tool (Svcutil.exe) nel file di configurazione dell'applicazione client generato) nel file di configurazione dell'applicazione client. Ad esempio, per il file eseguibile di Visual Basic 6.0 denominato CallCenterClient.exe, la configurazione deve essere posizionata in un file denominato CallCenterConfig.exe.config all'interno della stessa directory del file eseguibile. L'applicazione client può ora usare il moniker. Si noti che la configurazione del binding non è necessaria se si usa uno dei tipi di binding standard forniti da WCF.
Viene registrato il tipo seguente.
using System.ServiceModel; [ServiceContract] public interface IMathService { [OperationContract] public int Add(int x, int y); [OperationContract] public int Subtract(int x, int y); }
L'applicazione viene esposta usando un'associazione
wsHttpBinding
. Per il tipo e la configurazione dell'applicazione specificati, vengono usate le stringhe del moniker di esempio seguenti.service4:address=http://localhost/MathService, binding=wsHttpBinding, bindingConfiguration=Binding1
or
service4:address=http://localhost/MathService, binding=wsHttpBinding, bindingConfiguration=Binding1, contract={36ADAD5A-A944-4d5c-9B7C-967E4F00A090}
È possibile usare entrambe le stringhe del moniker dall'interno dell'applicazione Visual Basic 6.0, dopo avere aggiunto un riferimento all'assembly contenente i tipi
IMathService
, come illustrato nel codice di esempio seguente.Dim mathProxy As IMathService Dim result As Integer Set mathProxy = GetObject( _ "service4:address=http://localhost/MathService, _ binding=wsHttpBinding, _ bindingConfiguration=Binding1") result = mathProxy.Add(3, 5)
In questo esempio, la definizione per la configurazione del binding
Binding1
viene archiviata in un file di configurazione adeguatamente denominato per l'applicazione client, ad esempio vb6appname.exe.config.Nota
È possibile usare codice simile in C#, C++ o in qualsiasi altra applicazione del linguaggio .NET.
Nota
Se il formato del moniker non è valido o il servizio non è disponibile, la chiamata a
GetObject
restituirà un errore di sintassi non valida. Se si riceve questo errore, verificare che il moniker che si sta usando sia valido e che il servizio sia disponibile.Anche se questo argomento si concentra sull'uso del moniker servizio da codice Visual Basic 6.0, è possibile usare un moniker servizio da altri linguaggi. Quando si usa un moniker da codice C++, l'assembly generato da Svcutil.exe deve essere importato con "no_namespace named_guids raw_interfaces_only", come illustrato nel codice seguente.
#import "ComTestProxy.tlb" no_namespace named_guids
Ciò modifica le definizioni dell'interfaccia importate, in modo che tutti i metodi restituiscano un
HResult
. Tutti gli altri valori restituiti vengono convertiti in parametri out. L'esecuzione complessiva dei metodi resta la stessa. Questo consente di determinare la causa di un'eccezione quando si chiama un metodo sul proxy. Questa funzionalità è disponibile solo da codice C++.