2010-10-05 64 views
1
编写C++包装时

,我发现了以下错误在我的WCF项目:误差WCF

“‘System.InvalidOperationException’类型的未处理的异常出现在System.ServiceModel.dll

更多信息:找不到在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#库。看到我的评论如下。

+0

生成错误的代码将会有所帮助。否则,答案可能太模糊,无法帮助。 – 2010-10-05 14:13:46

+0

好点。我用有问题的代码更新了它。 – Contango 2010-10-05 23:22:30

回答

1

通常,当您使用WCF中你有你的config文件中描述的结合使用,以及在服务所在的端点条目客户端项目:

我假设您的FeedClient类是从ClientBase(IPhiFeed)继承的类。 ClientBase实际上定义了许多构造函数,如果你调用没有参数的构造函数,它会尝试在配置文件中找到'默认'客户端端点;并且在这种情况下不存在一个,因为配置中定义的唯一端点具有名称。要纠正这一点,你可以做两件事情之一:你可以调用ClientBase构造函数的字符串参数与端点名称:ClientBase<IPhiFeed>("MyService") 或者你可以更改配置文件,以使端点没有一个名字:

编辑: 你在你的问题有代码看起来像C#代码。 FeedClient类是否从ClientBase继承?如果是,并且调用它的C#代码有效,那么什么是C++代码不起作用?通常在C++代码中,您可以同时拥有托管代码和非托管代码;即非托管代码可以调用托管代码。在您的非托管项目中,您应该执行以下操作:转至项目的属性页面,单击配置属性常规;在Project Defaults下的常规选项卡中,从底部开始的第二个选项应该是Common Language Runtime Support,确保它设置为Common Language Runtime Support(/ clr)。如有必要,将包含FeedClient类的项目添加为非托管项目的引用。那么你应该能够直接在非托管代码中实例化FeedClient类:

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

这听起来像你知道WCF里面。目前,C#项目仍然完美运行,而C++/CLI仍然像以前一样抛出相同的错误。但是,如果我从app.config中删除端点名称,则C#项目将停止工作,并出现错误“无法找到ServiceModel客户端配置部分中引用合同'IPhiFeed'的默认端点元素”。你知道我可以用来直接从C++/CLI项目测试IPhiFeed类实例化的C++/CLI代码吗? – Contango 2010-10-06 12:34:06

+0

查看我的回答中的编辑 – 2010-10-06 12:42:54

+0

我发现了这个问题,现在一切正常了:我的可执行文件是“out.exe”,我需要将“app.config”复制到“out.exe.config”。如果将“app.config”添加到项目中,C#会自动执行此操作,但C++项目不会自动执行此操作。现在我有一个100%工作的C++/CLI项目引用一个调用WCF的C#库。感谢史蒂夫的慷慨帮助 - 非常感谢。 – Contango 2010-10-06 14:09:07