首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Remoting泛型方法重載Bug深度排查(二):添加重載觸發NullReferenceException根因分析

     編輯:關於C語言

問題復現步驟

  1. 基線正常**:單一泛型方法int Add<T>(T c),Client調用成功。
  2. 添加重載**:接口新增int Add<T>(IList<T> list),Server實現同樣返回0。
  3. Client調用原方法拋異常**:System.NullReferenceException,堆棧指向MethodCall.ResolveMethod。
  4. 重命名消除重載**:將新方法改名Add2,調用恢復正常。
  5. 去泛型參數保留重載**:int Add(GameRecordDetail c)/int Add(IList<GameRecordDetail> list),調用正常。

觸發條件總結

同時滿足兩條件時觸發:

  1. 目標方法為泛型方法**。
  2. 目標方法存在重載**。

堆棧分析

Server stack trace:
at System.Runtime.Remoting.Messaging.MethodCall.ResolveMethod(Boolean bThrowIfNotResolved)
at System.Runtime.Remoting.Messaging.MethodCall..ctor(Object handlerObject, BinaryMethodCallMessage smuggledMsg)
at System.Runtime.Serialization.Formatters.Binary.BinaryMethodCall.ReadArray(...)
...
at RemotingLib.IComputer.Add[TEntity](TEntity c)

異常發生在反序列化調用消息階段**(ResolveMethod),而非方法執行階段。

根因假設

Remoting序列化/反序列化機制在處理泛型方法重載**時,無法正確解析MethodBase,導致MethodCall構造失敗。具體可能涉及:

  • 泛型參數與重載特徵簽在傳輸協議中編碼衝突。
  • BinaryMethodCallMessage解析邏輯未正確處理泛型重載歧義。
  • .NET Remoting舊有架構對泛型支持不完善(2.0時代已知限制)。

臨時規避方案

  • 重命名消除重載**(如AddSingle/AddBatch),最簡單有效。
  • 避免泛型方法重載**:改用具體類型參數或非泛型重載。
  • 遷移至WCF/gRPC/WebAPI**:Remoting屬舊技術棧,新項目不建議使用。

深層修復需修改Remoting底層Formatter/Sink,成本極高,不具備工程可行性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved