2016-04-29 15 views
0

各プラグインが独自のAppDomainにロードされているC#でプラグインフレームワークを実装しようとしています。 AppDomainsの間のリモートレイヤーが私のプラグインのインスタンスをガベージコレクションしているように見える問題があります。各プラグインはこのクラスから継承します:AppDomainのオブジェクトでガベージコレクトが発生する

public class PluginRefObject : MarshalByRefObject{ 
    public override object InitializeLifetimeService() { 
     return null; 
    } 
} 

私はオブジェクトに無限の寿命を与えると考えていました。しかし、プラグインは少しのために働くように見えるし、その後、突然、私はエラーメッセージを表示してRemotingExceptionを取得する:グーグルでから、私は信じて、

Object 'longhexstring.rem' has been disconnected or does not exist at the server 

は、GCが私のリモートオブジェクトを削除したことを意味します。このオブジェクトを生かし続けるために他の何かをしなくてはなりませんか?

+0

可能な答えアンロードするために、次のとおりです。http:/を/stackoverflow.com/a/6339701/1186321 – denvercoder9

+0

ええ、私はそれを見ました。リンクが悪く、投稿された.chmファイルが開かない – spectacularbob

+0

謝罪;私はこれが参考になると思います:https://msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx – denvercoder9

答えて

0

プラグインに例外がスローされ、AppDomainがアンロードされることが判明しました。

しかし、ややこしいバグでした。私のプラグインはTcpChannelを登録しました。ChannelServices.UnregisterChannel()を介してTcpChannelを切断したかったという点がありました。どうやら、チャネルを実行しているスレッドはまだ動き続けていて、次回チャネルにアクセスしようとしたときに非同期的にObjectDisposedExceptionが投げられました。

グーグルた後、それを監視するTcpChannelを殺すために何のきれいな方法がないようだと、私は別のAppDomainにチャンネルをクリーンアップするために発見した最善の解決策はただAppDomain

関連する問題