.NET Remoting処理で「InvalidCastException: 引数の戻り値の型が無効です」の例外が発生する。
- 題名: .NET Remoting処理で「InvalidCastException: 引数の戻り値の型が無効です」の例外が発生する。
- 著者: tabi
- 日時: 2006/10/19 19:22:48
- ID: 17952
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: 【報告】この投稿はマルチポストです
- 著者: (報告)
- 日時: 2006/10/19 19:54:43
- ID: 17953
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 【報告】この投稿はマルチポストです
- 著者: tabi
- 日時: 2006/10/19 21:02:56
- ID: 17954
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: 【報告】この投稿はマルチポストです
- 著者: kkk
- 日時: 2006/10/19 21:52:50
- ID: 17955
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 【報告】この投稿はマルチポストです
- 著者: tabi
- 日時: 2006/10/19 23:39:59
- ID: 17956
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
よろしくお願いします。 .NET Remotingを使用してアプリケーションを作成しています。 クライアントアプリケーションとサーバアプリケーションを作成し、 ホストA(WindowsXP)、B(WindowsServer2003)ともにそれぞれ配置しました。 どちらのホストもクライアント、サーバになり得ます) この状態で、 ・ホストAクライアントからホストAサーバへのアクセスは正常に動作しました。 ・ホストAクライアントからホストBサーバへのアクセスは正常に動作しました。 しかし、 ・ホストBクライアントからはホストBサーバへのアクセス ・ホストBクライアントからはホストAサーバへのアクセス の際に以下の例外が発生してしまいます。 正常に動作する構成もあるので、原因がよくわかりません。 Activator.GetObjectも成功しているのでファイアウォールの問題でもなさそうなのですが。。。 この例外が発生する原因をご存知の方いらっしゃいましたらご教授お願いいたします。m(_ _)m -------------------------------------------------------- System.InvalidCastException: 引数の戻り値の型が無効です。 場所 System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType) 場所 System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue) 場所 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 場所 CompanyName.RemoteShell.Client.IShellFactory.Create() 場所 CompanyName.RemoteShell.Client.TcpClient.Execute(String serverName, String commandLine, String& standardOutput, String& standardError) -------------------------------------------------------- 以下に各クラスのソースコードを示します。 長文で申し訳ありませんがすべて関連していると思われるので。。 ■TcpClientクラス -------------------------------------------------------- Imports System Imports System.Runtime.InteropServices Imports System.Runtime.Remoting Imports System.Runtime.Remoting.Channels Imports System.Runtime.Remoting.Channels.Tcp ''' <summary> ''' リモートシェルクライアントクラス。 ''' 指定されたサーバに対してコマンド実行の要求を行います。 ''' </summary> <ClassInterface(ClassInterfaceType.None), _ Guid("EC4C522F-4C61-43d3-8165-8B4BA78A9849")> _ Public Class TcpClient Implements ITcpClient Private tcpChannel As TcpChannel ''' <summary> ''' コンストラクタ。 ''' </summary> Public Sub New() Try tcpChannel = ChannelServices.GetChannel("tcp") If tcpChannel Is Nothing Then ' クライアントチャンネルを登録する。 tcpChannel = New TcpChannel() ChannelServices.RegisterChannel(tcpChannel, False) End If Catch ex As Exception Console.Error.WriteLine(ex.ToString) End Try End Sub ''' <summary> ''' 指定されたサーバで指定されたコマンドを実行します。 ''' </summary> ''' <param name="serverName">サーバ名</param> ''' <param name="commandLine">コマンドライン文字列</param> ''' <returns>実行したコマンドの戻り値を返します。コマンドが実行できなかったときは-1を返します。</returns> Public Function Execute(ByVal serverName As String, ByVal commandLine As String, ByRef standardOutput As String, ByRef standardError As String) As Integer Implements ITcpClient.Execute Try ' 引数のチェック If commandLine.Length <= 0 Then Console.WriteLine("コマンドを指定してください。") Return -1 End If Dim factory As IShellFactory = CType(Activator.GetObject(GetType(IShellFactory), _ "tcp://" + serverName + ":" + My.Settings.PortNo.ToString + "/RemoteShellFactory"), IShellFactory) Dim manager As IShellManager = factory.Create() '■■■■■■■例外が発生する箇所■■■■■■■ If manager Is Nothing Then Console.WriteLine("Could not locate server.") Return 1 End If Dim cmdArgs() As String = Split(commandLine) Dim response As Integer = manager.Execute(cmdArgs, standardOutput, standardError) 'Console.Out.WriteLine("RemoteShell.vb:standardOutput=[" + standardOutput + "]") 'Console.Error.WriteLine("RemoteShell.vb:standardError=[" + standardError + "]") Return response Catch ex As RemotingException Console.Error.WriteLine(ex.ToString) Return -1 Catch ex As Exception Console.Error.WriteLine(ex.ToString) Return -1 End Try End Function End Class -------------------------------------------------------- ■IShellFactoryインターフェースは以下です。 -------------------------------------------------------- Imports System ''' <summary> ''' RemoteShellManagerクラスをRemoteShellServerから取得するためのファクトリインターフェース ''' </summary> Public Interface IShellFactory ''' <summary> ''' RemoteShellManagerクラスを生成します。 ''' </summary> ''' <returns>生成されたRemoteShellManagerクラス</returns> Function Create() As IShellManager End Interface --------------------------------------------------------