Есть компанент COM+, написанный на C# , который активируется как сервер (Activation type - server). У него есть метод, который вызывается клиетским приложением, в одном из параметров этого метода передаётся объект созданный клиентом, который должен принимать callback вызовы от сервера.
Тип этого callback объекта определён в assembly COM+ компанента и конечно же унаследован от MarshalByRefObject object.
Это объект принимающий callback-и:
...
public interface ICallback
{
void OnResponce(string sResponce);
}
public class SrvCallback : MarshalByRefObject
{
private ICallback iClbk = null;
public SrvCallback(ICallback iClbk)
{
this.iClbk = iClbk;
}
public void OnResponce(string sResponce)
{
if ( this.iClbk != null )
{
this.iClbk.OnResponce(sResponce);
}
}
...
Это - метод COM+ компанента:
public void Test(string sText, SrvCallback callback)
{
for ( int i = 1; i < 4; i++ )
{
string sRsp = sText + " - " + i.ToString();
callback.OnResponce(sRsp);
}
}
Когда клиент пытается вызвать этот метод генерируется исключение, что мол не может преобразовать MarshalByRefObject к SrvCallback.
Такая "схема" работает с .NET ремоутингом, но не работает с COM+ или если сделать нечто подобное через COM interop, определив обычный Callback COM интерфейс в COM+ компаненте и написать клиента на C++, то всё работает как по маслу.
Никто не знает почему?
Буду признательным за помощь.