- PR -

.NET Remotingで公開するクラスをGACに登録するとFileNotFoundException

投稿者投稿内容
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-03-09 10:25
こんにちは。GACに登録する意味は了解しました。
で、自分も実際に試してみました。

まず、ryuujiさんが最初に試した、サーバー側でRemotingConfiguration.RegisterWellKnownServiceType()メソッドを使用する方法では、私の方も同じエラーが発生し失敗しました。

続いて、サーバー側でConfigを使うタイプにしてみたところ、こちらは成功しました。
多分、Configのtype属性の書き方が悪いのだと思います。もう一度書きますが、type属性には、クラス名(ネームスペース含む)とアセンブリ名の記述が必要です。
例えば、MyGacアセンブリに記述されているクラスが次のようなクラスだった場合、
-----
namespace MyGac
{
public class MyClass : System.MarshalByRefObject
{
:
}
}
-----
WellKnown要素は次のような記述になります。
-----
<wellknown mode="SingleCall" type="MyGac.MyClass, MyGac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxx" objectUri="MyClass" />
-----

最後にryuujiさんが試したクライアント側のConfigに記述する方法ですが、同じように完全限定名を書いたところ失敗しました。しかし、完全限定名ではない記述をしたところうまく動作しました。
(サーバー側はConfigタイプ)
-----
type="MyGac.MyClass, MyGac"
-----

ということで、やはりサーバー側のConfigの記述を見直してみてください。
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2005-03-09 13:14
毎々ありがとうございます。

すいません、App.Configの設定を相変わらず間違ったままでした。App.configファイルを修正したところ、Noderaさんのおっしゃる通り正常Remotingサーバのメソッドを呼ぶ事が出来ました。長々とお付き合い頂き有難うございました。どはまりしていたので本当に助かりました。

ところでApp.configファイルが無ければGACを指定できないのか?と思い色々試してみました。

まず、サーバ側のApp.configで完全限定名を指定できていれば良いようなのでApp.configを使わずに下記コードでType.GetTypeで完全限定名を指定してみました。が、結果は同じでした。

コード:
RemotingConfiguration.RegisterWellKnownServiceType(
        //typeof( MyTest.MyGac ), // ←ここを修正
	Type.GetType( "MyTest.MyGac, MyGac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxx" ),
	"service1.soap",
	WellKnownObjectMode.Singleton );



相変わらずクライアント側で例外が発生してるのでクライアント側にも同様にType.GetTypeで完全限定名を指定してみました。が、以前と同様にクライアント側では完全限定名を指定できません、という例外が発生しました。

RegisterWellKnownServiceTypeを使っても、App.configを使っても同様の事ができるはず、と考えていますのでこの点についてはもう少し調べてみてます。分かりましたらこちらにもフィードバックさせて頂きます。

おむすび君
常連さん
会議室デビュー日: 2005/03/11
投稿数: 29
投稿日時: 2005-03-11 15:35
こちら、参考になるのではないでしょうか。
http://www.dotnet247.com/247reference/msgs/29/148958.aspx

(以下、抜粋します)

Thus simply replace in your server:

RemotingConfiguration.RegisterWellKnownServiceType (
typeof ( Ron.RemotingClasses.RemoteRon ),
"Ron/RemotingClasses/RemoteRon",
WellKnownObjectMode.Singleton );

with:

WellKnownServiceTypeEntry e = new WellKnownServiceTypeEntry(
"Ron.RemotingClasses.RemoteRon",
"Ron.RemotingClasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=63236a40ccd2ace5",
"Ron/RemotingClasses/RemoteRon",
WellKnownObjectMode.Singleton );

RemotingConfiguration.RegisterWellKnownServiceType( e );

and it works (with Ron.RemotingClasses only in GAC) !

Or you could use a .config file 'RemotingServerServer.exe.config' :


・ (server.exe.configの説明...)
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2005-03-14 12:09
おむすび君さん、情報有難うございます。

引用:

こちら、参考になるのではないでしょうか。
http://www.dotnet247.com/247reference/msgs/29/148958.aspx



早速下記コードで試してみましたところ、例外なく呼び出すことが出来ました。上記のURLを読んでみた所、質問者の内容が今回の件と全く同一でした。これで残りの問題も解決されました。どうも有難うございました。

コード:
WellKnownServiceTypeEntry e = new WellKnownServiceTypeEntry( 
  "MyTest.MyGac", 
  "MyTest.MyGac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxx", 
  "service1.soap", 
  WellKnownObjectMode.Singleton ); 

RemotingConfiguration.RegisterWellKnownServiceType( e ); 

スキルアップ/キャリアアップ(JOB@IT)