MarshalByRefObject
オブジェクトのキャストに使用できるインターフェイスを特定することはできますか?MarshalByRefObjectをキャストするために使用できるインターフェイスを特定する方法は?
キャスト演算子はどのようにMarshalByRefObject
オブジェクトで動作しますか?方法はCreateObjRef
ですか?
おかげで、 マッシモ
MarshalByRefObject
オブジェクトのキャストに使用できるインターフェイスを特定することはできますか?MarshalByRefObjectをキャストするために使用できるインターフェイスを特定する方法は?
キャスト演算子はどのようにMarshalByRefObject
オブジェクトで動作しますか?方法はCreateObjRef
ですか?
おかげで、 マッシモ
ここでは、インターフェイスのリストを取得するための回避策を示します。
パブリックインターフェイスを定義IDescriptor
public interface IDescriptor
{
List<string> GetInterfaces();
}
インタフェースを実装する基本クラスを定義:サービスオブジェクトを定義する代わりMasrhalByRefObjectのBaseMasrhalByRefObjectを使用より
public class BaseMasrhalByRefObject : MasrhalByRefObject, IDescriptor
{
public BaseMasrhalByRefObject() : base() {}
public List<string> GetInterfaces()
{
List<string> types = new List<string>();
foreach(Type i in GetType().GetInterfaces())
{
types.Add(i.AssemblyQualifiedName);
}
return types;
}
}
:
public class MyServiceObject : BaseMasrhalByRefObject, MyInterface1, MyInterface2, ...
{
// Add logic method
}
を
AppDomain Aでrを作成するMyServiceObjectのeferenceオブジェクトです。 AppDomain Bでは、リモートオブジェクトのプロキシを取得します。プロキシはIDescriptorにキャストできます:
public List<Type> GetInterfaces(MasrhalByRefObject proxy)
{
List<Type> types = new List<Type>();
IDescriptor des = proxy as IDescriptor;
if (des != null)
{
foreach(string t in des.GetInterfaces()) // this is a remote call
{
types.Add(Type.GetType(t);
}
}
return types;
}
のMarshalByRefObjectは、それを実装するすべてのクラスはMarshalByRefObjectから派生する場合は、確認することはできません唯一のインターフェイスを持つクラスです。ただし、オブジェクトのインスタンスがある場合は、次の式を使用して簡単に確認できます。
if (obj1 is MarshalByRefObject)
{
// do your thing
}
私は、MasrhalByRefObjectのインスタンスであるオブジェクトをキャストするために使用できるすべてのインターフェイスをどのように見つけることができるかを意味します。私はオブジェクトがMasrhalByRefObjectのインスタンスであることを知っています。この条件をテストする必要はありません。問題は、メソッドGetType()。GetInterfaces()がvoid配列を返すが、私はインターフェイスMyInterfaceにobjをキャストできます。 –
さて、あなたの問題を今理解しています。そのオブジェクトをどのように作成していますか(Activatorを使用してリモートオブジェクトへのプロキシを取得していますか?)、あなたのケースでGetType()メソッドが返すタイプは何ですか? –
あなたが持っているオブジェクトが 'Activator.GetObject(...) 'を使って作成されたリモートオブジェクトへのプロキシである場合、それがwellKnownTypeとして登録されているので、公開しているインターフェイスを本当に知っているはずです。あるいは、おそらくRealProxyを取得し、インターフェースを取得するための保護されたメソッドを呼び出すこともできます。この投稿はあなたを助けるかもしれません:[http://stackoverflow.com/a/7060298/1014643](http://stackoverflow.com/a/7060298/1014643) –