为WCF编写C ++包装器时出错

时间:2010-10-05 13:50:40

标签: wcf wcf-binding wcf-security

我的WCF项目中出现以下错误:

“System.ServiceModel.dll中发生了'System.InvalidOperationException'类型的未处理异常

其他信息:找不到引用ServiceModel客户端配置部分中的合同“IPhiFeed”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。“

WCF项目有点实验性:是托管和非托管C ++以及C#的混合体。我已经在纯C#中工作,但是我必须从非托管C ++中使用WCF,因此需要在WCF周围编写C ++包装。

更新

根据要求,以下是抛出异常的代码:

// 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.

更新

发现问题,它与代码无关:您必须将app.config复制到out.exe.config。我现在有一个100%正在运行的C ++ / CLI项目调用一个使用WCF的C#库。请参阅下面的评论。

1 个答案:

答案 0 :(得分:1)

通常,当您在客户端项目中使用wcf时,配置文件中的条目描述了要使用的绑定以及服务所在的端点:

           

我假设您的FeedClient类是继承自ClientBase(IPhiFeed)的类。 ClientBase实际上定义了许多构造函数,如果你调用没有参数的构造函数,它将尝试在配置文件中找到“默认”客户端点;在这种情况下,没有一个,因为配置中定义的唯一端点具有名称。要纠正这个问题,您可以执行以下两项操作之一:您可以调用ClientBase构造函数,该构造函数接受带有端点名称的字符串参数:ClientBase<IPhiFeed>("MyService") 或者您可以更改配置文件,以便端点没有名称:

           

<强>编辑: 您在问题中的代码看起来像C#代码。 FeedClient类是否继承自ClientBase?如果是,并且调用它的C#代码工作,那么什么是不起作用的C ++代码?通常,在C ++代码中,您可以同时拥有托管代码和非托管代码;这是非托管代码可以调用托管代码。在非托管项目中,您应该执行以下操作:转到项目的属性页,单击“配置属性”,然后单击“常规”;在“项目默认值”下的常规选项卡中,底部选项中的第二个选项应为“公共语言运行时支持”,请确保将其设置为“公共语言运行时支持”(/ clr)。如有必要,添加包含FeedClient类的项目作为对非托管项目的引用。然后,您应该能够直接在非托管代码中实例化FeedClient类:

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