代码之家  ›  专栏  ›  技术社区  ›  Yogender Solanki

从C#到C++/CLI进行RPC调用时超时

  •  0
  • Yogender Solanki  · 技术社区  · 11 年前
    public ref class RequestMessage
    {
    public:
        [ProtoMember(1)]
        Int32 Number1;
        [ProtoMember(2)]
        Int32 Number2;
    };
    
    // Response message declared as managed class.
    public ref class ResponseMessage
    {
        public:
        [ProtoMember(1)]
        Int32 Result;
    };
    
    void OnMessageReceived(System::Object ^sender, TypedRequestReceivedEventArgs<RequestMessage^> ^e);
    int main(array<System::String ^> ^args)
    {
        ISerializer ^aSerializer = gcnew ProtoBufSerializer();
        IDuplexTypedMessagesFactory ^aReceiverFactory = gcnew DuplexTypedMessagesFactory(aSerializer);
        IDuplexTypedMessageReceiver<ResponseMessage^, RequestMessage^> ^aReceiver =aReceiverFactory->CreateDuplexTypedMessageReceiver<ResponseMessage^, RequestMessage^>();
        aReceiver->MessageReceived +=    gcnew System::EventHandler<Eneter::Messaging::EndPoints::TypedMessages::TypedRequestReceivedEventArgs<RequestMessage ^> ^>(&OnMessageReceived);
        IMessagingSystemFactory ^aMessaging = gcnew TcpMessagingSystemFactory();
        IDuplexInputChannel ^anInputChannel =aMessaging->CreateDuplexInputChannel("tcp://127.0.0.1:4502/");
        aReceiver->AttachDuplexInputChannel(anInputChannel);
        Console::WriteLine("The calculator service is running. Press ENTER to stop.");
        Console::ReadLine();
        aReceiver->DetachDuplexInputChannel();
    
        return 0;
    }
    
    void OnMessageReceived(System::Object ^sender,TypedRequestReceivedEventArgs<RequestMessage ^> ^e)
    {
        ResponseMessage ^aResponseMessage = gcnew ResponseMessage();
        aResponseMessage->Result = e->RequestMessage->Number1 + e->RequestMessage->Number2;
    
        Console::WriteLine("{0} + {1} = {2}", e->RequestMessage->Number1, e->RequestMessage->Number2, aResponseMessage->Result);
    
        // Send back the response message.
        IDuplexTypedMessageReceiver<ResponseMessage^, RequestMessage^> ^aReceiver = (IDuplexTypedMessageReceiver<ResponseMessage^, RequestMessage^>^)sender;
        aReceiver->SendResponseMessage(e->ResponseReceiverId, aResponseMessage);
    
    }
    

    上面的代码是使用协议缓冲区的RPC的服务器代码,但除了客户端之外,其他所有客户端都无法从服务器获得任何响应。同样的代码在C#中工作,但它不能使用C++。。。我认为我们可以用C++/CLI编写一个与C#代码相当的代码。但是这个代码不起作用,我的客户机使用C#代码很好。 我注意到没有调用OnMessageRecived()函数。

    这里是本机C++和C#服务器代码的示例,但我希望使用纯托管C++ http://eneter.blogspot.in/2013/12/native-c-how-to-communicate-with-net.html

    任何人都可以告诉我发生了什么……我该如何解决这个问题。

    1 回复  |  直到 11 年前
        1
  •  0
  •   Machavity Labib Hussain    5 年前

    我不是100%确定,但我认为您的案例中的问题可能是RequestMessage和ResponseMessage声明中缺少属性[ProtoControl]。

    例如,在服务侧:

        [ProtoContract]
        public ref class RequestMessage
        {
        public:
            [ProtoMember(1)]
            Int32 Number1;
            [ProtoMember(2)]
            Int32 Number2;
        };
    

    然后在客户端:

        [ProtoContract]
        public class RequestMessage
        {
            [ProtoMember(1)]
            public int Number1 { get; set; }
            [ProtoMember(2)]
            public int Number2 { get; set; }
        }
    
    推荐文章