DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.NET Remoting処理で「InvalidCastException: 引数の戻り値の型が無効です」の例外が発生する。

  • 題名: .NET Remoting処理で「InvalidCastException: 引数の戻り値の型が無効です」の例外が発生する。
  • 著者: tabi
  • 日時: 2006/10/19 19:22:48
  • ID: 17952
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB.NET]
分類:[.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
--------------------------------------------------------
この投稿はマルチポストです。

●マルチポストされている場所
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=838439&SiteID=7

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
申し訳ありません。注意書きをよく読んでいませんでした。

以下の場所に同じ内容で質問しております。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=838439&SiteID=7

問題が解決次第、すべての掲示板に速やかに報告いたします。
よろしくお願いいたします。
■No17954に返信(tabiさんの記事)
> 申し訳ありません。注意書きをよく読んでいませんでした。
>
> 以下の場所に同じ内容で質問しております。
> http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=838439&SiteID=7
>
> 問題が解決次第、すべての掲示板に速やかに報告いたします。
> よろしくお願いいたします。
>

鬼の首を取ったような突っ込み
自己解決できました。

クライアントのコンポーネントをグローバルアセンブリキャッシュに登録するとうまく動きました。

ホストAには登録が完了していたため、うまく動作していました。

ありがとうございました。m(_ _;)m
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板