Ошибка при написании оболочки C ++ для WCF - PullRequest
1 голос
/ 05 октября 2010

Я получаю следующую ошибку в своем проекте WCF:

"Произошло необработанное исключение типа 'System.InvalidOperationException' в System.ServiceModel.dll

Дополнительная информация: Не удалосьнайдите элемент конечной точки по умолчанию, который ссылается на контракт «IPhiFeed» в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации или из-за того, что в элементе клиента не найден элемент конечной точки, соответствующий этому контракту.

Проект WCF немного экспериментален: представляет собой смесь управляемого и неуправляемого C ++ и C #.У меня все работает в чистом C #, но я должен использовать WCF из неуправляемого C ++, поэтому мне нужно написать оболочку C ++ вокруг WCF.

Update

По запросу, вот код, который выдает исключение:

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

Обновление

Обнаружена проблема, это не было связано с кодом: необходимо скопировать приложение.config to out.exe.config.Теперь у меня есть 100% работающий проект C ++ / CLI, вызывающий библиотеку C #, которая использует WCF.Смотрите мои комментарии ниже.

1 Ответ

1 голос
/ 06 октября 2010

Обычно, когда вы используете 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...
...