Files
2026-06-04 11:42:34 +02:00

163 lines
4.9 KiB
C#

using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Threading;
namespace System.Runtime.Remoting.Channels
{
// Token: 0x0200039B RID: 923
[MonoTODO("Handle domain unloading?")]
internal class CrossAppDomainSink : IMessageSink
{
// Token: 0x0600258C RID: 9612 RVA: 0x0007C98C File Offset: 0x0007AB8C
internal CrossAppDomainSink(int domainID)
{
this._domainID = domainID;
}
// Token: 0x0600258E RID: 9614 RVA: 0x0007C9C4 File Offset: 0x0007ABC4
internal static CrossAppDomainSink GetSink(int domainID)
{
object syncRoot = CrossAppDomainSink.s_sinks.SyncRoot;
CrossAppDomainSink crossAppDomainSink;
lock (syncRoot)
{
if (CrossAppDomainSink.s_sinks.ContainsKey(domainID))
{
crossAppDomainSink = (CrossAppDomainSink)CrossAppDomainSink.s_sinks[domainID];
}
else
{
CrossAppDomainSink crossAppDomainSink2 = new CrossAppDomainSink(domainID);
CrossAppDomainSink.s_sinks[domainID] = crossAppDomainSink2;
crossAppDomainSink = crossAppDomainSink2;
}
}
return crossAppDomainSink;
}
// Token: 0x170006FD RID: 1789
// (get) Token: 0x0600258F RID: 9615 RVA: 0x0007CA5C File Offset: 0x0007AC5C
internal int TargetDomainId
{
get
{
return this._domainID;
}
}
// Token: 0x06002590 RID: 9616 RVA: 0x0007CA64 File Offset: 0x0007AC64
private static CrossAppDomainSink.ProcessMessageRes ProcessMessageInDomain(byte[] arrRequest, CADMethodCallMessage cadMsg)
{
CrossAppDomainSink.ProcessMessageRes processMessageRes = default(CrossAppDomainSink.ProcessMessageRes);
try
{
AppDomain.CurrentDomain.ProcessMessageInDomain(arrRequest, cadMsg, out processMessageRes.arrResponse, out processMessageRes.cadMrm);
}
catch (Exception ex)
{
IMessage message = new MethodResponse(ex, new ErrorMessage());
processMessageRes.arrResponse = CADSerializer.SerializeMessage(message).GetBuffer();
}
return processMessageRes;
}
// Token: 0x06002591 RID: 9617 RVA: 0x0007CADC File Offset: 0x0007ACDC
public virtual IMessage SyncProcessMessage(IMessage msgRequest)
{
IMessage message = null;
try
{
byte[] array = null;
byte[] array2 = null;
CADMethodReturnMessage cadmethodReturnMessage = null;
CADMethodCallMessage cadmethodCallMessage = CADMethodCallMessage.Create(msgRequest);
if (cadmethodCallMessage == null)
{
MemoryStream memoryStream = CADSerializer.SerializeMessage(msgRequest);
array2 = memoryStream.GetBuffer();
}
Context currentContext = Thread.CurrentContext;
try
{
CrossAppDomainSink.ProcessMessageRes processMessageRes = (CrossAppDomainSink.ProcessMessageRes)AppDomain.InvokeInDomainByID(this._domainID, CrossAppDomainSink.processMessageMethod, null, new object[] { array2, cadmethodCallMessage });
array = processMessageRes.arrResponse;
cadmethodReturnMessage = processMessageRes.cadMrm;
}
finally
{
AppDomain.InternalSetContext(currentContext);
}
if (array != null)
{
MemoryStream memoryStream2 = new MemoryStream(array);
message = CADSerializer.DeserializeMessage(memoryStream2, msgRequest as IMethodCallMessage);
}
else
{
message = new MethodResponse(msgRequest as IMethodCallMessage, cadmethodReturnMessage);
}
}
catch (Exception ex)
{
try
{
message = new ReturnMessage(ex, msgRequest as IMethodCallMessage);
}
catch (Exception)
{
}
}
return message;
}
// Token: 0x06002592 RID: 9618 RVA: 0x0007CBFC File Offset: 0x0007ADFC
public virtual IMessageCtrl AsyncProcessMessage(IMessage reqMsg, IMessageSink replySink)
{
AsyncRequest asyncRequest = new AsyncRequest(reqMsg, replySink);
ThreadPool.QueueUserWorkItem(new WaitCallback(this.SendAsyncMessage), asyncRequest);
return null;
}
// Token: 0x06002593 RID: 9619 RVA: 0x0007CC28 File Offset: 0x0007AE28
public void SendAsyncMessage(object data)
{
AsyncRequest asyncRequest = (AsyncRequest)data;
IMessage message = this.SyncProcessMessage(asyncRequest.MsgRequest);
asyncRequest.ReplySink.SyncProcessMessage(message);
}
// Token: 0x170006FE RID: 1790
// (get) Token: 0x06002594 RID: 9620 RVA: 0x0007CC58 File Offset: 0x0007AE58
public IMessageSink NextSink
{
get
{
return null;
}
}
// Token: 0x04000EBB RID: 3771
private static Hashtable s_sinks = new Hashtable();
// Token: 0x04000EBC RID: 3772
private static MethodInfo processMessageMethod = typeof(CrossAppDomainSink).GetMethod("ProcessMessageInDomain", BindingFlags.Static | BindingFlags.NonPublic);
// Token: 0x04000EBD RID: 3773
private int _domainID;
// Token: 0x0200039C RID: 924
private struct ProcessMessageRes
{
// Token: 0x04000EBE RID: 3774
public byte[] arrResponse;
// Token: 0x04000EBF RID: 3775
public CADMethodReturnMessage cadMrm;
}
}
}