0

シングルトンにしたいアセンブリにクラスがあります。サーバー アプリケーションで作成し、同じマシン上の別のアプリケーションがこのクラス インスタンスにアクセスできるようにします。

この遅延読み込みの実装を使用して、インスタンスが 1 つだけ存在するようにしています。

Private Shared ReadOnly _instance As New Lazy(Of PersonX)(Function() New PersonX(), System.Threading.LazyThreadSafetyMode.ExecutionAndPublication)

Public Shared ReadOnly Property Instance() As PersonX
    Get
        Return _instance.Value
    End Get
End Property

そして、次のリモーティング コードでPrivate Sub New を使用しています。

Dim uri As String = String.Format("tcp://{0}:{1}/PersonX", "localhost", 1976)
RemotingServices.Marshal(Person.Instance, uri)
RemotingConfiguration.RegisterActivatedServiceType(GetType(PersonX))

Calling コードでは、最初のインスタンスを次のように作成します。

Dim PersonX as SingletonTestClass.PersonX = SingletonTestClass.PersonX.Instance

次のコードを使用して、リモート処理を使用してインスタンスに接続しています。

Dim newPerson As SingletonTestClass.PersonX
Dim uri As String = String.Format("tcp://{0}:{1}/PersonX", "localhost", 1976)
newPerson = CType(Activator.GetObject(GetType(SingletonTestClass.PersonX), uri), SingletonTestClass.PersonX)

しかし、オブジェクトのプロパティにアクセスしようとすると、次の行にRequested Service not foundというエラーが表示されます。

newPerson.Name = "Fred"
4

1 に答える 1

0

質問に答えるには、Remoting オブジェクトをマーシャリングする前にチャネルを登録する必要があります。

シンプルで機能する C# の例を参照してください。

public class Test : MarshalByRefObject
    {
        public string Echo(string message)
        {
            return "Echo: " + message;
        }
    }

private void button1_Click(object sender, EventArgs e)
        {
            ChannelServices.RegisterChannel(new TcpChannel(1234));
            Test test1 = new Test();
            RemotingServices.Marshal(test1, "TestService");

            Test test2 = (Test)Activator.GetObject(typeof(Test), "tcp://localhost:1234/TestService");
            MessageBox.Show(test2.Echo("Hey!"));
        }

ファイアウォールがポートをブロックしていないことを確認してください。

于 2012-11-22T15:46:37.307 に答える