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

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

上级 75d55186
...@@ -18,14 +18,7 @@ namespace Model ...@@ -18,14 +18,7 @@ namespace Model
if (message is AMessage || message is ARequest) if (message is AMessage || message is ARequest)
{ {
MessageInfo messageInfo = new MessageInfo(opcode, message); MessageInfo messageInfo = new MessageInfo(opcode, message);
if (opcode < 2000) Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
{
Game.Scene.GetComponent<EventComponent>().Run(EventIdType.MessageDeserializeFinish, messageInfo);
}
else
{
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
}
return; return;
} }
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using ILRuntime.CLR.Method;
using ILRuntime.Runtime.Intepreter;
namespace Model 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] [ObjectEvent]
public class MessageDispatherComponentEvent : ObjectEvent<MessageDispatherComponent>, IAwake, ILoad public class MessageDispatherComponentEvent : ObjectEvent<MessageDispatherComponent>, IAwake, ILoad
{ {
...@@ -17,12 +67,41 @@ namespace Model ...@@ -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>
/// 消息分发组件 /// 消息分发组件
/// </summary> /// </summary>
public class MessageDispatherComponent : Component public class MessageDispatherComponent : Component
{ {
private Dictionary<ushort, List<IMHandler>> handlers; private Dictionary<ushort, List<IMessageMethod>> handlers;
public void Awake() public void Awake()
{ {
...@@ -31,7 +110,7 @@ namespace Model ...@@ -31,7 +110,7 @@ namespace Model
public void Load() public void Load()
{ {
handlers = new Dictionary<ushort, List<IMHandler>>(); handlers = new Dictionary<ushort, List<IMessageMethod>>();
Type[] types = DllHelper.GetMonoTypes(); Type[] types = DllHelper.GetMonoTypes();
...@@ -46,26 +125,49 @@ namespace Model ...@@ -46,26 +125,49 @@ namespace Model
IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type); IMHandler iMHandler = (IMHandler)Activator.CreateInstance(type);
if (!this.handlers.ContainsKey(messageHandlerAttribute.Opcode)) 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) public void Handle(MessageInfo messageInfo)
{ {
List<IMHandler> actions; List<IMessageMethod> actions;
if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions)) if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
{ {
Log.Error($"消息 {messageInfo.Opcode} 没有处理"); Log.Error($"消息 {Opcode2Name.GetName(messageInfo.Opcode)}({messageInfo.Opcode}) 没有处理");
return; return;
} }
foreach (IMHandler ev in actions) foreach (IMessageMethod ev in actions)
{ {
try try
{ {
ev.Handle(messageInfo.Message); ev.Run(messageInfo.Message);
} }
catch (Exception e) catch (Exception e)
{ {
...@@ -76,7 +178,7 @@ namespace Model ...@@ -76,7 +178,7 @@ namespace Model
public override void Dispose() public override void Dispose()
{ {
if (this.Id == 0) if (Id == 0)
{ {
return; return;
} }
......
...@@ -7,7 +7,7 @@ namespace Hotfix ...@@ -7,7 +7,7 @@ namespace Hotfix
{ {
protected abstract void Run(Message message); protected abstract void Run(Message message);
public void Handle(object msg) public void Handle(AMessage msg)
{ {
Message message = msg as Message; Message message = msg as Message;
if (message == null) if (message == null)
......
...@@ -2,9 +2,15 @@ ...@@ -2,9 +2,15 @@
namespace Hotfix namespace Hotfix
{ {
#if ILRuntime
public interface IMHandler public interface IMHandler
{ {
void Handle(object message); void Handle(AMessage message);
Type GetMessageType(); 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 @@ ...@@ -80,14 +80,12 @@
<Compile Include="Base\Other\IUIFactory.cs" /> <Compile Include="Base\Other\IUIFactory.cs" />
<Compile Include="Component\GameObjectComponent.cs" /> <Compile Include="Component\GameObjectComponent.cs" />
<Compile Include="Component\KVComponent.cs" /> <Compile Include="Component\KVComponent.cs" />
<Compile Include="Component\MessageDispatherComponent.cs" />
<Compile Include="Component\TimeComponent.cs" /> <Compile Include="Component\TimeComponent.cs" />
<Compile Include="Component\TimerComponent.cs" /> <Compile Include="Component\TimerComponent.cs" />
<Compile Include="Component\UIComponent.cs" /> <Compile Include="Component\UIComponent.cs" />
<Compile Include="Entity\Hotfix.cs" /> <Compile Include="Entity\Hotfix.cs" />
<Compile Include="Entity\Scene.cs" /> <Compile Include="Entity\Scene.cs" />
<Compile Include="Entity\UI.cs" /> <Compile Include="Entity\UI.cs" />
<Compile Include="Event\SessionRecvMessage_Dispatch.cs" />
<Compile Include="Init.cs" /> <Compile Include="Init.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UI\UILobby\Component\UILobbyComponent.cs" /> <Compile Include="UI\UILobby\Component\UILobbyComponent.cs" />
...@@ -97,6 +95,7 @@ ...@@ -97,6 +95,7 @@
<Compile Include="UI\UILogin\Factory\UILoginFactory.cs" /> <Compile Include="UI\UILogin\Factory\UILoginFactory.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Event\" />
<Folder Include="Handler\" /> <Folder Include="Handler\" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
......
...@@ -164,6 +164,8 @@ ...@@ -164,6 +164,8 @@
<ItemGroup> <ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" /> <None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.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> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" /> <Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
...@@ -214,6 +214,8 @@ ...@@ -214,6 +214,8 @@
<ItemGroup> <ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" /> <None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.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> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" /> <Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
...@@ -516,6 +516,8 @@ ...@@ -516,6 +516,8 @@
<ItemGroup> <ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" /> <None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.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> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" /> <Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
...@@ -581,6 +581,8 @@ ...@@ -581,6 +581,8 @@
<ItemGroup> <ItemGroup>
<None Include="Assets\Res\Config\BuffConfig.txt" /> <None Include="Assets\Res\Config\BuffConfig.txt" />
<None Include="Assets\Res\Config\UnitConfig.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> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="GenerateTargetFrameworkMonikerAttribute" /> <Target Name="GenerateTargetFrameworkMonikerAttribute" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册