xLua icon indicating copy to clipboard operation
xLua copied to clipboard

LuaCallCSharp 里面需要配置 Dictionary 的 Enumerator 和 KeyValuePair 么?

Open j98355 opened this issue 4 years ago • 3 comments

我把 xLua 里使用反射时的 Warning 打开了,且该成了报错,然后我在 LuaCallCSharp 里面配置了 Dictionary<int, int>,但是运行时会提示我:

System.Collections.Generic.Dictionary`2[TKey,TValue] not gen, using reflection instead
UnityEngine.Debug:LogError (object)
XLua.ObjectTranslator:TryDelayWrapLoader (intptr,System.Type) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:179)
XLua.ObjectTranslator:getTypeId (intptr,System.Type,bool&,XLua.ObjectTranslator/LOGLEVEL) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1062)
XLua.ObjectTranslator:GetTypeId (intptr,System.Type) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1018)
XLua.StaticLuaCallbacks:ImportType (intptr) (at Assets/ThirdParty/XLua/Src/StaticLuaCallbacks.cs:858)
XLua.Utils:SetCSTable (intptr,System.Type,int) (at Assets/ThirdParty/XLua/Src/Utils.cs:1369)
XLua.Utils:BeginClassRegister (System.Type,intptr,XLua.LuaDLL.lua_CSFunction,int,int,int) (at Assets/ThirdParty/XLua/Src/Utils.cs:1219)
XLua.CSObjectWrap.SystemCollectionsGenericDictionary_2Enumerator_SystemInt32SystemInt32_Wrap:__Register (intptr) (at Assets/ThirdParty/XLua/Gen/System_Collections_Generic_Dictionary_2_Enumerator_System_Int32_System_Int32_Wrap.cs:37)
XLua.ObjectTranslator:TryDelayWrapLoader (intptr,System.Type) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:157)
XLua.ObjectTranslator:getTypeId (intptr,System.Type,bool&,XLua.ObjectTranslator/LOGLEVEL) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1062)
XLua.ObjectTranslator:Push (intptr,object) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1284)
XLua.CSObjectWrap.SystemCollectionsGenericDictionary_2_SystemInt32SystemInt32_Wrap:_m_GetEnumerator (intptr) (at Assets/ThirdParty/XLua/Gen/System_Collections_Generic_Dictionary_2_System_Int32_System_Int32_Wrap.cs:295)
XLua.DelegateBridge:PCall (intptr,int,int,int) (at Assets/ThirdParty/XLua/Src/DelegateBridge.cs:138)
XLua.DelegateBridge:__Gen_Delegate_Imp6 () (at Assets/ThirdParty/XLua/Gen/DelegatesGensBridge.cs:161)
UnityEngine.EventSystems.EventSystem:Update () (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:385)
System.Collections.Generic.Dictionary`2+Enumerator[System.Int32,System.Int32] not gen, using reflection instead
UnityEngine.StackTraceUtility:ExtractStackTrace ()
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:LogError (object)
XLua.ObjectTranslator:TryDelayWrapLoader (intptr,System.Type) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:179)
XLua.ObjectTranslator:getTypeId (intptr,System.Type,bool&,XLua.ObjectTranslator/LOGLEVEL) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1062)
XLua.ObjectTranslator:Push (intptr,object) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1284)
XLua.ObjectTranslator:PushAny (intptr,object) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1197)
XLua.OverloadMethodWrap:Call (intptr) (at Assets/ThirdParty/XLua/Src/MethodWarpsCache.cs:254)
XLua.MethodWrap:Call (intptr) (at Assets/ThirdParty/XLua/Src/MethodWarpsCache.cs:297)
XLua.StaticLuaCallbacks:FixCSFunction (intptr) (at Assets/ThirdParty/XLua/Src/StaticLuaCallbacks.cs:111)
XLua.DelegateBridge:PCall (intptr,int,int,int) (at Assets/ThirdParty/XLua/Src/DelegateBridge.cs:138)
XLua.DelegateBridge:__Gen_Delegate_Imp6 () (at Assets/ThirdParty/XLua/Gen/DelegatesGensBridge.cs:161)
UnityEngine.Events.InvokableCall:Invoke ()
UnityEngine.Events.UnityEvent:Invoke ()
UnityEngine.UI.Button:Press () (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:68)
UnityEngine.UI.Button:OnPointerClick (UnityEngine.EventSystems.PointerEventData) (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:110)
UnityEngine.EventSystems.ExecuteEvents:Execute (UnityEngine.EventSystems.IPointerClickHandler,UnityEngine.EventSystems.BaseEventData) (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents:Execute<UnityEngine.EventSystems.IPointerClickHandler> (UnityEngine.GameObject,UnityEngine.EventSystems.BaseEventData,UnityEngine.EventSystems.ExecuteEvents/EventFunction`1<UnityEngine.EventSystems.IPointerClickHandler>) (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:262)
UnityEngine.EventSystems.StandaloneInputModule:ReleaseMouse (UnityEngine.EventSystems.PointerEventData,UnityEngine.GameObject) (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/InputModules/StandaloneInputModule.cs:187)
UnityEngine.EventSystems.StandaloneInputModule:ProcessMousePress (UnityEngine.EventSystems.PointerInputModule/MouseButtonEventData) (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/InputModules/StandaloneInputModule.cs:642)
UnityEngine.EventSystems.StandaloneInputModule:ProcessMouseEvent (int) (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/InputModules/StandaloneInputModule.cs:548)
UnityEngine.EventSystems.StandaloneInputModule:ProcessMouseEvent () (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/InputModules/StandaloneInputModule.cs:528)
UnityEngine.EventSystems.StandaloneInputModule:Process () (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/InputModules/StandaloneInputModule.cs:282)
UnityEngine.EventSystems.EventSystem:Update () (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:385)

(Filename: Assets/ThirdParty/XLua/Src/ObjectTranslator.cs Line: 179)

我加了 Dictionary<int, int>.Enumerator 之后,第一个错还在,第二个变成了:

System.Collections.Generic.KeyValuePair`2[System.Int32,System.Int32] not gen, using reflection instead
UnityEngine.Debug:LogError (object)
XLua.ObjectTranslator:TryDelayWrapLoader (intptr,System.Type) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:179)
XLua.ObjectTranslator:getTypeId (intptr,System.Type,bool&,XLua.ObjectTranslator/LOGLEVEL) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1062)
XLua.ObjectTranslator:Push (intptr,object) (at Assets/ThirdParty/XLua/Src/ObjectTranslator.cs:1284)
XLua.CSObjectWrap.SystemCollectionsGenericDictionary_2Enumerator_SystemInt32SystemInt32_Wrap:_g_get_Current (intptr) (at Assets/ThirdParty/XLua/Gen/System_Collections_Generic_Dictionary_2_Enumerator_System_Int32_System_Int32_Wrap.cs:144)
XLua.DelegateBridge:PCall (intptr,int,int,int) (at Assets/ThirdParty/XLua/Src/DelegateBridge.cs:138)
XLua.DelegateBridge:__Gen_Delegate_Imp6 () (at Assets/ThirdParty/XLua/Gen/DelegatesGensBridge.cs:161)
UnityEngine.EventSystems.EventSystem:Update () (at C:/Program Files/Unity/Hub/Editor/2020.3.2f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:385)

我尝试再加上 KeyValuePair<int, int>,但是生成完代码后会有编译报错:

Assets\ThirdParty\XLua\Gen\System_Collections_Generic_KeyValuePair_2_System_Int32_System_Int32_Wrap.cs(132,39): error CS1061: 'KeyValuePair<int, int>' does not contain a definition for 'Deconstruct' and no accessible extension method 'Deconstruct' accepting a first argument of type 'KeyValuePair<int, int>' could be found (are you missing a using directive or an assembly reference?)

List我也有遇到了类似的问题,会说 System.Collections.Generic.List`1[T] 和对应的 Enumerator 没生成。

请问这类问题要怎么解决呢?

j98355 avatar Oct 19 '21 05:10 j98355

每一个不同泛型参数的泛型示例,都是不一样的类,如果要避免反射,就要加

chexiongsheng avatar Oct 27 '21 07:10 chexiongsheng

你这个是别的参数,不是Dictionary<int, int>?

chexiongsheng avatar Oct 27 '21 07:10 chexiongsheng

每一个不同泛型参数的泛型示例,都是不一样的类,如果要避免反射,就要加

我已经加了 Dictionary<int, int>,但是还是有反射提示,而且很奇怪 提示的是 System.Collections.Generic.Dictionary`2[TKey,TValue] 而不是这种指出具体类型的:System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]

我在 Lua 里面的调用是: for id, count in pairs(InventorySystem.items) do 这个 InventorySystem.items 就是那个 Dictionary

j98355 avatar Nov 10 '21 06:11 j98355