2010-10-05 5 views
1

Je reçois l'erreur suivante dans mon projet WCF:Erreur lors de l'écriture C++ wrapper pour WCF

« Une exception non gérée du type 'System.InvalidOperationException' a eu lieu dans System.ServiceModel.dll

Informations complémentaires : Impossible de trouver l'élément de point de terminaison par défaut qui référence le contrat 'IPhiFeed' dans la section de configuration du client ServiceModel, car aucun fichier de configuration n'a été trouvé pour votre application ou aucun élément de point de terminaison correspondant à ce contrat.

Le projet WCF est un peu expérimental: est un mélange de C++ managé et non managé, et C#. Tout fonctionne en C# pur, mais je dois consommer WCF à partir de C++ non géré, d'où la nécessité d'écrire un wrapper C++ autour de WCF.

Mise à jour

Comme demandé, est le code ici des thats lève l'exception:

// WCF library written in C# 
public class EngineAPI : IEngineAPI 
{ 
    public FeedClient client; 
    // constructor 
    public EngineAPI() 
    { 
    // the line below in this C# library works *perfectly* when called from a C# 
    // console app, but it fails when a C++ console app calls the same C# library 
    // UPDATE: exception fixed if you copy app.config to out.exe.config, see comments below 
    client = new FeedClient(); // << exception here 

    } 
    ..... 
} 
// NOTE: the line "client = new FeedClient" instantiates generatedProxy.cs, 
// which is generated with svcutil 
// NOTE: if I temporarily delete "app.config" from the pure C# project, it generates *exactly* the same error as I'm getting when I attempt to call everything from the separate C++ project with managed code. 

Mise à jour

trouvé le problème, il a été sans rapport avec le code: vous avez pour copier app.config sur out.exe.config. J'ai maintenant un projet C++/CLI travaillant à 100% appelant une bibliothèque C# qui utilise WCF. Voir mes commentaires ci-dessous.

+0

Le code qui génère l'erreur serait utile. Sinon, une réponse pourrait être trop vague pour être utile. –

+0

Bon point. Je l'ai mis à jour avec le code en question. – Contango

Répondre

1

En général, lorsque vous utilisez WCF dans le projet de client que vous avez des entrées dans votre fichier de configuration qui décrivent la liaison à utiliser ainsi que le point final où le service est situé:

Je suppose que votre classe FeedClient est la classe qui hérite de ClientBase (IPhiFeed). ClientBase définit réellement de nombreux constructeurs, si vous appelez le constructeur sans paramètres, il tentera de trouver le point de terminaison client 'default' dans votre fichier de configuration; et dans ce cas il n'y en a pas parce que la seule extrémité définie dans la configuration a un nom. Pour corriger cela, vous pouvez le faire de deux choses: vous pouvez appeler le constructeur de ClientBase qui prend un paramètre de chaîne avec le nom du point final: ClientBase<IPhiFeed>("MyService") ou vous pouvez modifier le fichier de configuration afin que le critère d'évaluation ne porte pas de nom:

: Edits Le code que vous avez dans votre question ressemble à du code C#. La classe FeedClient hérite-t-elle de ClientBase? Si oui et le code C# qui l'appelle fonctionne, quel est le code C++ qui ne fonctionne pas? En général, dans le code C++, vous pouvez avoir du code géré et non managé; c'est un code non géré peut appeler dans le code managé. Dans votre projet non géré, vous devez effectuer les opérations suivantes: accéder à la page de propriétés du projet, cliquer sur Propriétés de configuration, Général; Dans l'onglet Général sous Project Defaults, la deuxième option de l'option inférieure doit être Common Language Runtime Support, assurez-vous qu'elle est définie sur Common Language Runtime Support (/ clr). Ajoutez le projet qui contient la classe FeedClient en tant que référence au projet non géré si nécessaire.Ensuite, vous devriez être capable d'instancier la classe FeedClient directement en code non managé:

MyNamespace::FeedClient wcfClient; 
wcfClient.SomeMethod() // Add parameters as appropriate... 
+0

On dirait que vous connaissez parfaitement la WCF. À l'heure actuelle, le projet C# fonctionne toujours parfaitement, tandis que le C++/CLI lance toujours la même erreur qu'avant. Toutefois, si je supprime le nom de point de terminaison de app.config, le projet C# cesse de fonctionner avec l'erreur "Impossible de trouver l'élément de point de terminaison par défaut qui référence le contrat 'IPhiFeed' dans la section de configuration du client ServiceModel. Connaissez-vous le code C++/CLI que je pourrais utiliser pour tester l'instanciation des classes IPhiFeed directement à partir du projet C++/CLI? – Contango

+0

Voir les modifications dans ma réponse –

+0

J'ai découvert le problème, et maintenant tout fonctionne parfaitement: mon exécutable était "out.exe", et j'avais besoin de copier "app.config" à "out.exe.config". C# le fait automatiquement si vous ajoutez "app.config" à votre projet, mais un projet C++ ne le fait pas automatiquement. Maintenant, j'ai un projet C++/CLI fonctionnant à 100% faisant référence à une bibliothèque C# qui appelle WCF. Merci Steve pour votre aide généreuse - vraiment l'apprécier. – Contango