2

私はいくつかのソフトウェアを備えた 2 台の PC を持っていますが、別の PC でメソッドを実行するには 1 台の PC が必要です。高低を検索しましたが、これを行う方法について何も見つかりませんでした。これを行うには、引数、メソッド名、および戻りオブジェクトをシリアル化する独自の小さなインターフェイスを作成し、これをソケット経由で送信してから、これを逆シリアル化し、リフレクションを使用してメソッドを実行し、ソケット経由で結果オブジェクトを返します。しかし、別の方法でもっと簡単なことを書き始める前に、他の人の意見が欲しいです。

  • 複数の引数を送信します (それらはすべてオブジェクトとして受信および送信されます)
  • オブジェクトを返す
  • 例外オブジェクトが発生した場合、シリアライズして戻します

オブジェクトのシリアル化とソケット経由での送信については何もしていませんが、すべての標準オブジェクトはシリアル化できますか? のようにList<> array[] float dateTime

私はこれをうまく説明したいと思っています。

4

3 に答える 3

3

サービス WCF を作成し、TCP で動作するように WCF を構成します。

これにより、ほとんどのものが「すぐに使える」ものになります(シリアル化/逆シリアル化、ソケットのオープン/クローズ)

herehere、および良い読み物hereに良い例があります

于 2013-06-05T10:06:37.953 に答える
1

インターネットで例を検索し、いくつかのコードを貼り付けました。誰かがそれを必要とする場合は、ここに投稿します。これは汚いコードですが、機能します。InvokeMethod はクライアント側にあり、startIBC は各サーバーで開始する必要があるものです。

[ServiceContract]
    public interface IBlissRequest
    {
        [OperationContract]
        object SystemRequest(string InstanceName, string MethodName, params object[] Parameters);
    }

    public class BlissRequest : IBlissRequest
    {
        public object SystemRequest(string InstanceName, string MethodName, params object[] Parameters)
        {
            return System21.BlissProcessingUnit.BPU.RequestFromIBC(InstanceName, MethodName, Parameters);
        }
    }

public static object InvokeMethod(string targetIpAddress, string InstanceName, string MethodName, params object[] Parameters)
        {
            try
            {
                var ep = "net.tcp://" + targetIpAddress + ":9985/IBC";

                NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);

                ChannelFactory<IBlissRequest> pipeFactory = new ChannelFactory<IBlissRequest>(binding, new EndpointAddress(ep));

                IBlissRequest pipeProxy = pipeFactory.CreateChannel();

                return pipeProxy.SystemRequest(InstanceName, MethodName, Parameters);
            }
            catch 
            {
                BPUConsole.WriteLine(BPUConsole.WriteSource.IBC, "Unable to execute method: '" + MethodName +"' on Instance: '"+InstanceName+"' becouse IBC is unable to connect to: "+ targetIpAddress);
                throw new Exception("Unable to connect to: " + targetIpAddress);
            }
        }

        public static void StartIBC()
        {
            var uri = "net.tcp://" + BlissProcessingUnit.BPUInformation.LocalIpAddresses[0] + ":9985";
            Console.WriteLine("Opening connection on: " + uri);

            ServiceHost host = new ServiceHost(typeof(BlissRequest), new Uri[] { new Uri(uri) });

            NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);

            host.AddServiceEndpoint(typeof(IBlissRequest), binding, "IBC");

            host.Open();

            Console.WriteLine("Service is available. " + "Press <ENTER> to exit.");

        }
于 2013-06-11T06:39:42.250 に答える