提交 1d01430f 编写于 作者: T tanghai

抹平了hotfix层跟mono层消息分发,hotfix跟mono层可以同时订阅同一个消息

上级 75d55186
......@@ -18,14 +18,7 @@ namespace Model
if (message is AMessage || message is ARequest)
{
MessageInfo messageInfo = new MessageInfo(opcode, message);
if (opcode < 2000)
{
Game.Scene.GetComponent<EventComponent>().Run(EventIdType.MessageDeserializeFinish, messageInfo);
}
else
{
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
}
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
return;
}
......
using System;
using System.Collections.Generic;
using System.Reflection;
using ILRuntime.CLR.Method;
using ILRuntime.Runtime.Intepreter;
namespace Model
{
/// <summary>
/// 用来抹平ILRuntime跟mono层差异
/// </summary>
public interface IMessageMethod
{
void Run(AMessage a);
}
public class IMessageMonoMethod : IMessageMethod
{
private readonly IMHandler iMHandler;
public IMessageMonoMethod(IMHandler iMHandler)
{
this.iMHandler = iMHandler;
}
public void Run(AMessage a)
{
this.iMHandler.Handle(a);
}
}
public class IMessageILMethod : IMessageMethod
{
private readonly ILRuntime.Runtime.Enviorment.AppDomain appDomain;
private readonly ILTypeInstance instance;
private readonly IMethod method;
private readonly object[] param;
public IMessageILMethod(Type type, string methodName)
{
appDomain = Init.Instance.AppDomain;
this.instance = this.appDomain.Instantiate(type.FullName);
this.method = this.instance.Type.GetMethod(methodName);
int n = this.method.ParameterCount;
this.param = new object[n];
}
public void Run(AMessage a)
{
this.param[0] = a;
this.appDomain.Invoke(this.method, this.instance, param);
}
}
[ObjectEvent]
public class MessageDispatherComponentEvent : ObjectEvent<MessageDispatherComponent>, IAwake, ILoad
{
......@@ -17,12 +67,41 @@ namespace Model
}
}
public static class Opcode2Name
{
private static Dictionary<int, string> _init = new Dictionary<int, string>();
public static string GetName(int code)
{
if (_init.Count == 0)
{
Type type = typeof(Opcode);
FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
if (!field.IsStatic)
{
continue;
}
int codeID = (ushort)field.GetValue(null);
if (_init.ContainsKey(codeID))
{
Log.Warning($"重复的Opcode:{codeID}");
continue;
}
_init.Add(codeID, field.Name);
}
}
return _init[code];
}
}
/// <summary>
/// 消息分发组件
/// </summary>
public class MessageDispatherComponent : Component
{
private Dictionary<ushort, List<IMHandler>> handlers;
private Dictionary<ushort, List<IMessageMethod>> handlers;
public void Awake()
{
......@@ -31,7 +110,7 @@ namespace Model
public void Load()
{
handlers = new Dictionary<ushort, List<IMHandler>>();
handlers = new Dictionary<ushort, List<IMessageMethod>>();
Type[] types = DllHelper.GetMonoTypes();
......@@ -46,26 +125,49 @@ namespace Model
IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode))
{
this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMHandler>());
this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMessageMethod>());
}
this.handlers[messageHandlerAttribute.Opcode].Add(new IMessageMonoMethod(iMHandler));
}
// hotfix dll
Type[] hotfixTypes = DllHelper.GetHotfixTypes();
foreach (Type type in hotfixTypes)
{
object[] attrs = type.GetCustomAttributes(typeof(MessageHandlerAttribute), false);
if (attrs.Length == 0)
{
continue;
}
MessageHandlerAttribute messageHandlerAttribute = (MessageHandlerAttribute)attrs[0];
#if ILRuntime
IMessageMethod iMessageMethod = new IMessageILMethod(type, "Run");
#else
IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
IMessageMethod iMessageMethod = new IMessageMonoMethod(iMHandler);
#endif
if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode))
{
this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMessageMethod>());
}
this.handlers[messageHandlerAttribute.Opcode].Add(iMHandler);
this.handlers[messageHandlerAttribute.Opcode].Add(iMessageMethod);
}
}
public void Handle(MessageInfo messageInfo)
{
List<IMHandler> actions;
List<IMessageMethod> actions;
if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
{
Log.Error($"消息 {messageInfo.Opcode} 没有处理");
Log.Error($"消息 {Opcode2Name.GetName(messageInfo.Opcode)}({messageInfo.Opcode}) 没有处理");
return;
}
foreach (IMHandler ev in actions)
foreach (IMessageMethod ev in actions)
{
try
{
ev.Handle(messageInfo.Message);
ev.Run(messageInfo.Message);
}
catch (Exception e)
{
......@@ -76,7 +178,7 @@ namespace Model
public override void Dispose()
{
if (this.Id == 0)
if (Id == 0)
{
return;
}
......
......@@ -7,7 +7,7 @@ namespace Hotfix
{
protected abstract void Run(Message message);
public void Handle(object msg)
public void Handle(AMessage msg)
{
Message message = msg as Message;
if (message == null)
......
......@@ -2,9 +2,15 @@
namespace Hotfix
{
#if ILRuntime
public interface IMHandler
{
void Handle(object message);
void Handle(AMessage message);
Type GetMessageType();
}
#else
public interface IMHandler : Model.IMHandler
{
}
#endif
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using Model;
namespace Hotfix
{
[ObjectEvent]
public class MessageDispatherComponentEvent : ObjectEvent<MessageDispatherComponent>, IAwake, ILoad
{
public void Awake()
{
this.Get().Awake();
}
public void Load()
{
this.Get().Load();
}
}
/// <summary>
/// 消息分发组件
/// </summary>
public class MessageDispatherComponent: Component, IAwake, ILoad
{
private Dictionary<ushort, List<IMHandler>> handlers;
public void Awake()
{
this.Load();
}
public void Load()
{
handlers = new Dictionary<ushort, List<IMHandler>>();
Type[] types = DllHelper.GetHotfixTypes();
foreach (Type type in types)
{
object[] attrs = type.GetCustomAttributes(typeof(MessageHandlerAttribute), false);
if (attrs.Length == 0)
{
continue;
}
MessageHandlerAttribute messageHandlerAttribute = (MessageHandlerAttribute)attrs[0];
IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode))
{
this.handlers.Add(messageHandlerAttribute.Opcode, new List<IMHandler>());
}
this.handlers[messageHandlerAttribute.Opcode].Add(iMHandler);
}
}
public void Handle(MessageInfo messageInfo)
{
List<IMHandler> actions;
if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
{
Log.Error($"消息 {messageInfo.Opcode} 没有处理");
return;
}
foreach (IMHandler ev in actions)
{
try
{
ev.Handle(messageInfo.Message);
}
catch (Exception e)
{
Log.Error(e.ToStr());
}
}
}
public override void Dispose()
{
if (this.Id == 0)
{
return;
}
base.Dispose();
}
}
}
\ No newline at end of file
using Model;
namespace Hotfix
{
// 订阅mono层的Session发出的事件
[Event((int)EventIdType.MessageDeserializeFinish)]
public class MessageDeserializeFinish_Dispatch: IEvent<MessageInfo>
{
public void Run(MessageInfo messageInfo)
{
Hotfix.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
}
}
}
......@@ -80,14 +80,12 @@
<Compile Include="Base\Other\IUIFactory.cs" />
<Compile Include="Component\GameObjectComponent.cs" />
<Compile Include="Component\KVComponent.cs" />
<Compile Include="Component\MessageDispatherComponent.cs" />
<Compile Include="Component\TimeComponent.cs" />
<Compile Include="Component\TimerComponent.cs" />
<Compile Include="Component\UIComponent.cs" />
<Compile Include="Entity\Hotfix.cs" />
<Compile Include="Entity\Scene.cs" />
<Compile Include="Entity\UI.cs" />
<Compile Include="Event\SessionRecvMessage_Dispatch.cs" />
<Compile Include="Init.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UI\UILobby\Component\UILobbyComponent.cs" />
......@@ -97,6 +95,7 @@
<Compile Include="UI\UILogin\Factory\UILoginFactory.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Event\" />
<Folder Include="Handler\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
......
......@@ -164,6 +164,8 @@
<ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
......@@ -214,6 +214,8 @@
<ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
......@@ -516,6 +516,8 @@
<ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
......@@ -581,6 +581,8 @@
<ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Error.txt" />
<None Include="Assets\StreamingAssets\Logs\Log-Client-Info.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册