Exemplo n.º 1
0
    public static string GetMethodDeclare(MethodInfo method, ref bool bNeedExport)
    {
        bNeedExport = true;
        string szFullName = method.Name;

        ParameterInfo[] allParams   = method.GetParameters();
        string          szCallParam = string.Empty;
        string          szParamName = string.Empty;

        if (allParams != null)
        {
            Type nParamType;
            for (int i = 0; i < allParams.Length; ++i)
            {
                nParamType = allParams[i].ParameterType;
                if (i > 0)
                {
                    szCallParam += ',';
                }
                FCValueType value = TransType(nParamType);
                szParamName = value.GetTypeName(false);
                if (szParamName.IndexOf('*') != -1)
                {
                    bNeedExport = false;
                    return(string.Empty);
                }
                szCallParam += szParamName;
                szCallParam += " ";
                szCallParam += allParams[i].Name;
            }
        }
        return(szFullName + szCallParam);
    }
Exemplo n.º 2
0
    void PushConstructor(ConstructorInfo cons)
    {
        ParameterInfo[] allParams   = cons.GetParameters();
        string          szCallParam = string.Empty;
        Type            nParamType;

        if (allParams != null)
        {
            for (int i = 0; i < allParams.Length; ++i)
            {
                ParameterInfo param = allParams[i];
                nParamType = param.ParameterType;
                PushNameSpace(nParamType.Namespace);
                PushDelayType(nParamType);
                PushRefType(nParamType);
                if (i > 0)
                {
                    szCallParam += ',';
                }
                FCValueType value = FCValueType.TransType(nParamType);
                szCallParam += value.GetTypeName(false);
                szCallParam  = szCallParam + " " + param.Name;
            }
        }
        m_szTempBuilder.AppendFormat("    public {0}({1}){{}}\r\n", FCValueType.GetClassName(m_nClassType), szCallParam);
    }
Exemplo n.º 3
0
    void MakeOutList(FCValueType value)
    {
        StringBuilder fileData   = m_szTempBuilder;
        string        szTypeName = value.GetTypeName(true, true);

        string szFuncDeclare = string.Format("    public static void OutList({0} rList, long L, int nIndex)", szTypeName);

        if (TrySetExportFlag(szFuncDeclare))
        {
            return;
        }
        fileData.AppendLine(szFuncDeclare);
        fileData.AppendLine("    {");
        fileData.AppendLine("        try");
        fileData.AppendLine("        {");
        fileData.AppendLine("            int nCount = rList != null ? rList.Count : 0;");
        fileData.AppendLine("            long ptr = FCLibHelper.fc_get_param_ptr(L, nIndex);");
        fileData.AppendLine("            FCLibHelper.fc_set_array_size(ptr, nCount);");
        if (FCValueType.IsRefType(value.m_nValueType))
        {
            fileData.AppendFormat("            {0} v;\r\n", value.GetValueName(true));
        }
        fileData.AppendLine("            for(int i = 0; i<nCount; ++i)");
        fileData.AppendLine("            {");
        fileData.AppendLine("                long pItem = FCLibHelper.fc_get_array_node_temp_ptr(ptr, i);");
        MakeOutListElement(value);
        fileData.AppendLine("            }");
        fileData.AppendLine("        }");
        fileData.AppendLine("        catch(Exception e)");
        fileData.AppendLine("        {");
        fileData.AppendLine("            Debug.LogException(e);");
        fileData.AppendLine("        }");
        fileData.AppendLine("    }");
    }
    void  MakeDeleteCallFunc(Type nClassType)
    {
        // 得到委托的参数

        MethodInfo method = nClassType.GetMethod("Invoke");

        ParameterInfo[] allParams = method.GetParameters();  // 函数参数
        FCValueType     ret_value = FCValueType.TransType(method.ReturnType);

        string szCallDesc  = string.Empty;
        int    nParamCount = allParams != null ? allParams.Length : 0;

        for (int i = 0; i < nParamCount; ++i)
        {
            FCValueType value_param = FCValueType.TransType(allParams[i].ParameterType);
            if (i > 0)
            {
                szCallDesc += ",";
            }
            szCallDesc += string.Format("{0} arg{1}", value_param.GetTypeName(true, true), i);
        }
        m_szTempBuilder.AppendFormat("    public {0}  CallFunc({1})\r\n", ret_value.GetTypeName(true, true), szCallDesc);
        m_szTempBuilder.AppendLine("    {");
        m_szTempBuilder.AppendLine("        try");
        m_szTempBuilder.AppendLine("        {");
        string szArg = string.Empty;

        for (int i = 0; i < nParamCount; ++i)
        {
            szArg = string.Format("arg{0}", i);
            FCValueType value_param = FCValueType.TransType(allParams[i].ParameterType);
            if (value_param.m_nTemplateType != fc_value_tempalte_type.template_none)
            {
                Debug.LogError(nClassType.FullName + "参数不支持模板");
                continue;
            }
            if (FCValueType.IsRefType(value_param.m_nValueType))
            {
                m_szTempBuilder.AppendFormat("            FCDll.PushCallParam(ref {0});\r\n", szArg);
            }
            else
            {
                m_szTempBuilder.AppendFormat("            FCDll.PushCallParam({0});\r\n", szArg);
            }
        }
        m_szTempBuilder.AppendLine("            FCLibHelper.fc_call(m_nThisPtr, m_szFuncName);");
        m_szTempBuilder.AppendLine("        }");
        m_szTempBuilder.AppendLine("        catch(Exception e)");
        m_szTempBuilder.AppendLine("        {");
        m_szTempBuilder.AppendLine("            Debug.LogException(e);");
        m_szTempBuilder.AppendLine("        }");
        m_szTempBuilder.AppendLine("    }");
    }
Exemplo n.º 5
0
    public static void OutputRefScriptParam(StringBuilder fileData, string szLeftEmpty, FCValueType value, string szLeftName, string Ptr, string szIndex, bool bTempValue)
    {
        if (value.IsArray)
        {
            fileData.AppendFormat("{0}FCCustomParam.OutArray({1}, {2}, {3});\r\n", szLeftEmpty, szLeftName, Ptr, szIndex);
            return;
        }
        else if (value.IsList)
        {
            fileData.AppendFormat("{0}FCCustomParam.OutList({1}, {2}, {3});\r\n", szLeftEmpty, szLeftName, Ptr, szIndex);
            return;
        }
        else if (value.IsMap)
        {
            fileData.AppendFormat("{0}FCCustomParam.OutDictionary({1}, {2}, {3});\r\n", szLeftEmpty, szLeftName, Ptr, szIndex);
            return;
        }
        //
        string szOutPtr    = string.Format("nOutPtr{0}", szIndex);
        string szValueName = string.Format("arg{0}", szIndex);

        fileData.AppendFormat("{0}long {1} = FCLibHelper.fc_get_param_ptr({2}, {3});\r\n", szLeftEmpty, szOutPtr, Ptr, szIndex);
        string szType = value.GetTypeName(true, true);

        if (IsBaseType(value.m_nValueType))
        {
            string szFuncAddr = GetFCLibFuncShortName(value.m_nValueType);
            if (IsRefType(value.m_nValueType))
            {
                fileData.AppendFormat("{0}FCLibHelper.fc_set_value_{1}({2}, ref {3});\r\n", szLeftEmpty, szFuncAddr, szOutPtr, szValueName);
            }
            else
            {
                fileData.AppendFormat("{0}FCLibHelper.fc_set_value_{1}({2}, {3});\r\n", szLeftEmpty, szFuncAddr, szOutPtr, szValueName);
            }
            return;
        }
        fileData.AppendFormat("{0}FCLibHelper.fc_set_value_intptr({1}, FCGetObj.PushObj({2}));\r\n", szLeftEmpty, szOutPtr, szValueName);
    }
Exemplo n.º 6
0
    void  AddReturnCmd(FCValueType ret_value)
    {
        // 目前不是所有的类型都支持返回
        switch (ret_value.m_nValueType)
        {
        case fc_value_type.fc_value_bool:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_bool();");
            break;

        case fc_value_type.fc_value_char:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_char();");
            break;

        case fc_value_type.fc_value_byte:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_byte();");
            break;

        case fc_value_type.fc_value_short:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_short();");
            break;

        case fc_value_type.fc_value_ushort:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_ushort();");
            break;

        case fc_value_type.fc_value_int:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_int();");
            break;

        case fc_value_type.fc_value_uint:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_uint();");
            break;

        case fc_value_type.fc_value_float:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_float();");
            break;

        case fc_value_type.fc_value_double:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_double();");
            break;

        case fc_value_type.fc_value_int64:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_int64();");
            break;

        case fc_value_type.fc_value_uint64:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_uint64();");
            break;

        case fc_value_type.fc_value_string_a:
            m_szTempBuilder.AppendLine("            ret = FCLibHelper.fc_get_return_string_a();");
            break;

        case fc_value_type.fc_value_vector2:
            m_szTempBuilder.AppendLine("            FCLibHelper.fc_get_return_vector2(ref ret);");
            break;

        case fc_value_type.fc_value_vector3:
            m_szTempBuilder.AppendLine("            FCLibHelper.fc_get_return_vector3(ref ret);");
            break;

        case fc_value_type.fc_value_vector4:
            m_szTempBuilder.AppendLine("            FCLibHelper.fc_get_return_vector4(ref ret);");
            break;

        case fc_value_type.fc_value_system_object:
        {
            string szName = ret_value.GetTypeName(true, true);
            m_szTempBuilder.AppendLine("            long  nWrapObj = FCLibHelper.fc_get_return_wrap_objptr();");
            m_szTempBuilder.AppendFormat("            ret = FCGetObj.GetSystemObj<{0}>(nWrapObj);", szName);
        }
        break;

        case fc_value_type.fc_value_unity_object:
        case fc_value_type.fc_value_object:
        {
            string szName = ret_value.GetTypeName(true, true);
            m_szTempBuilder.AppendLine("            long  nWrapObj = FCLibHelper.fc_get_return_wrap_objptr();");
            m_szTempBuilder.AppendFormat("            ret = FCGetObj.GetObj<{0}>(nWrapObj);", szName);
        }
        break;

        case fc_value_type.fc_value_int_ptr:
            m_szTempBuilder.AppendLine("            ret = new IntPtr(FCLibHelper.fc_get_return_void_ptr());");
            break;
        }
        m_szTempBuilder.AppendLine("            return ret;");
    }
Exemplo n.º 7
0
    void SetMemberValue(StringBuilder fileData, string szLeftEmpty, FCValueType value, string szLeftName, string Ptr, string szIndex, bool bTempValue, bool bOut)
    {
        string szCSharpName = value.GetTypeName(true, true);
        string szDefine     = string.Empty;

        if (bTempValue)
        {
            szDefine = szCSharpName + " ";
        }
        if (value.IsArray)
        {
            fileData.AppendFormat("{0}{1} {2} = null;\r\n", szLeftEmpty, szCSharpName, szLeftName);
            fileData.AppendFormat("{0}{1} = FCCustomParam.GetArray(ref {2},{3},{4});\r\n", szLeftEmpty, szLeftName, szLeftName, Ptr, szIndex);
            return;
        }
        else if (value.IsList)
        {
            fileData.AppendFormat("{0}{1} {2} = null;\r\n", szLeftEmpty, szCSharpName, szLeftName);
            fileData.AppendFormat("{0}{1} = FCCustomParam.GetList(ref {2},{3},{4});\r\n", szLeftEmpty, szLeftName, szLeftName, Ptr, szIndex);
            return;
        }
        else if (value.IsMap)
        {
            fileData.AppendFormat("{0}{1} {2} = null;\r\n", szLeftEmpty, szCSharpName, szLeftName);
            fileData.AppendFormat("{0}{1} = FCCustomParam.GetDictionary(ref {2},{3},{4});\r\n", szLeftEmpty, szLeftName, szLeftName, Ptr, szIndex);
            return;
        }
        string szFuncAppend = FCValueType.GetFCLibFuncShortName(value.m_nValueType);

        if (string.IsNullOrEmpty(szFuncAppend))
        {
            if (value.m_nValueType == fc_value_type.fc_value_enum)
            {
                fileData.AppendFormat("{0}{1}{2} = ({3})(FCLibHelper.fc_get_int({4},{5}));\r\n", szLeftEmpty, szDefine, szLeftName, szCSharpName, Ptr, szIndex);
                return;
            }
            if (value.m_nValueType == fc_value_type.fc_value_int_ptr)
            {
                fileData.AppendFormat("{0}{1}{2} = ({3})(FCLibHelper.fc_get_intptr({4},{5}));\r\n", szLeftEmpty, szDefine, szLeftName, szCSharpName, Ptr, szIndex);
                return;
            }
            if (value.m_nValueType == fc_value_type.fc_value_system_object)
            {
                fileData.AppendFormat("{0}{1}{2} = FCGetObj.GetObj<System.Object>(FCLibHelper.fc_get_intptr({3},{4}));\r\n", szLeftEmpty, szDefine, szLeftName, Ptr, szIndex);
                return;
            }
            if (value.m_nValueType == fc_value_type.fc_value_unity_object)
            {
                fileData.AppendFormat("{0}{1}{2} = FCGetObj.GetObj<UnityObject>(FCLibHelper.fc_get_intptr({3},{4}));\r\n", szLeftEmpty, szDefine, szLeftName, Ptr, szIndex);
                return;
            }
            if (value.m_nValueType == fc_value_type.fc_value_delegate)
            {
                string szDelegateClassName = string.Format("{0}_deletate", value.GetDelegateName(true));
                m_deleteWrap.PushDelegateWrap(value.m_value, szDelegateClassName);

                fileData.AppendFormat("{0}{1} func{2} = FCDelegateMng.Instance.GetDelegate<{3}>({4},{5});\r\n", szLeftEmpty, szDelegateClassName, szIndex, szDelegateClassName, Ptr, szIndex);
                fileData.AppendFormat("{0}{1} arg{2} = null;\r\n", szLeftEmpty, szCSharpName, szIndex);
                fileData.AppendFormat("{0}if(func{1} != null)\r\n", szLeftEmpty, szIndex);
                fileData.AppendFormat("{0}    arg{1} = func{2}.CallFunc;\r\n", szLeftEmpty, szIndex, szIndex);
                fileData.AppendFormat("{0}// 尽量不要在函数参数中传递委托指针,这个无法自动托管,要尽可能是使用get, set属性方法\r\n", szLeftEmpty);
                fileData.AppendFormat("{0}// 如果在参数中传递了委托指针,请在对应的函数中调用FCDelegateMng.Instance.RecordDelegate(delegate_func, func);\r\n", szLeftEmpty);
                //fileData.AppendFormat("{0}else\r\n", szLeftEmpty, szIndex);
                //fileData.AppendFormat("{0}    arg{1} = null;\r\n", szLeftEmpty, szIndex);
                //fileData.AppendFormat("{0}FCDelegateMng.Instance.RecordDelegate({1}, func{2});\r\n", szLeftEmpty, szLeftName, szIndex); // 这里不能调用这个,对象不一样的噢
                return;
            }
        }
        else
        {
            if (FCValueType.IsGraphicType(value.m_nValueType))
            {
                fileData.AppendFormat("{0}{1} {2} = new {3}();\r\n", szLeftEmpty, szCSharpName, szLeftName, szCSharpName);
                fileData.AppendFormat("{0}FCLibHelper.fc_get_{1}({2},{3},ref {4});\r\n", szLeftEmpty, szFuncAppend, Ptr, szIndex, szLeftName);
                return;
            }
            else
            {
                fileData.AppendFormat("{0}{1}{2} = FCLibHelper.fc_get_{3}({4},{5});\r\n", szLeftEmpty, szDefine, szLeftName, szFuncAppend, Ptr, szIndex);
                return;
            }
        }
        fileData.AppendFormat("{0}{1}{2} = FCGetObj.GetObj<{3}>(FCLibHelper.fc_get_intptr({4},{5}));\r\n", szLeftEmpty, szDefine, szLeftName, szCSharpName, Ptr, szIndex);
    }
Exemplo n.º 8
0
    // 功能:添加函数调用的方法
    void PushMethodInfo(MethodInfo method)
    {
        if (0 != (MethodAttributes.SpecialName & method.Attributes))
        {
            return;
        }
        if (m_bPartWrap)
        {
            if (!method.IsDefined(typeof(PartWrapAttribute), false))
            {
                return;
            }
        }
        // 如果该函数有不导出的标记
        if (method.IsDefined(typeof(DontWrapAttribute), false))
        {
            return;
        }
        if (method.IsDefined(typeof(ObsoleteAttribute), false))
        {
            return;
        }
        string szMethodName  = method.ToString();
        bool   bTemplateFunc = IsTemplateFunc(method);

        // 模板函数暂时不导出吧
        if (bTemplateFunc)
        {
            return;
        }
        FCValueType ret_value = m_templateWrap.PushReturnTypeWrap(method.ReturnType);

        PushNameSpace(method.ReturnType.Namespace);

        int nSameNameCount = 0;

        if (m_CurSameName.TryGetValue(method.Name, out nSameNameCount))
        {
        }
        m_CurSameName[method.Name] = nSameNameCount + 1;
        int nFuncCount = 0;

        m_CurFuncCount.TryGetValue(method.Name, out nFuncCount);

        WrapFuncDesc func = new WrapFuncDesc();

        func.m_bAttrib = false;
        func.m_szName  = method.Name;
        if (nSameNameCount > 0)
        {
            func.m_szGetName = func.m_szSetName = string.Format("{0}{1}_wrap", method.Name, nSameNameCount);
        }
        else
        {
            func.m_szGetName = func.m_szSetName = string.Format("{0}_wrap", method.Name);
        }

        m_szTempBuilder.Length = 0;
        StringBuilder fileData = m_szTempBuilder;

        ParameterInfo[] allParams   = method.GetParameters(); // 函数参数
        Type            nRetType    = method.ReturnType;      // 返回值
        int             nParamCount = allParams != null ? allParams.Length : 0;
        bool            bEqualFunc  = func.m_szName == "Equals";

        fileData.AppendLine("    [MonoPInvokeCallbackAttribute(typeof(FCLibHelper.fc_call_back_inport_class_func))]");
        fileData.AppendFormat("    public static int {0}(long L)\r\n", func.m_szSetName);
        fileData.AppendLine("    {");
        fileData.AppendLine("        try");
        fileData.AppendLine("        {");

        fileData.AppendLine("            long nThisPtr = FCLibHelper.fc_get_inport_obj_ptr(L);");
        fileData.AppendFormat("            {0} obj = get_obj(nThisPtr);\r\n", m_szCurClassName);
        // 处理函数参数
        Type   nParamType;
        string szLeftName     = string.Empty;
        string szCallParam    = string.Empty;
        string szLeftType     = string.Empty;
        bool   bStatic        = method.IsStatic;
        string szFullFuncName = method.Name;

        for (int i = 0; i < nParamCount; ++i)
        {
            ParameterInfo param = allParams[i];
            nParamType = param.ParameterType;
            szLeftName = string.Format("arg{0}", i);
            PushNameSpace(nParamType.Namespace);
            FCValueType param_value = FCTemplateWrap.Instance.PushGetTypeWrap(nParamType);
            if (param.IsOut)
            {
                string szCSharpName = param_value.GetTypeName(true);
                fileData.AppendFormat("            {0} {1};\r\n", szCSharpName, szLeftName);
            }
            else
            {
                SetMemberValue(fileData, "            ", param_value, szLeftName, "L", i.ToString(), true, param.IsOut);
            }
            if (i > 0)
            {
                szCallParam += ',';
            }
            if (param.IsOut)
            {
                szCallParam += "out ";
            }
            else if (nParamType.IsByRef)
            {
                szCallParam += "ref ";
            }
            szCallParam   += szLeftName;
            szFullFuncName = szFullFuncName + '_' + param_value.GetTypeName(false);
        }
        // 处理返回值
        if (ret_value.m_nValueType == fc_value_type.fc_value_void)
        {
            if (bStatic)
            {
                fileData.AppendFormat("            {0}.{1}({2});\r\n", m_szCurClassName, func.m_szName, szCallParam);
            }
            else
            {
                fileData.AppendFormat("            obj.{0}({1});\r\n", func.m_szName, szCallParam);
            }
        }
        else
        {
            string szCShareRetName = ret_value.GetTypeName(true);
            if (bStatic)
            {
                fileData.AppendFormat("            {0} ret = {1}.{2}({3});\r\n", szCShareRetName, m_szCurClassName, func.m_szName, szCallParam);
            }
            else
            {
                fileData.AppendFormat("            {0} ret = obj.{1}({2});\r\n", szCShareRetName, func.m_szName, szCallParam);
            }
        }

        // 处理输出参数
        for (int i = 0; i < nParamCount; ++i)
        {
            ParameterInfo param = allParams[i];
            nParamType = param.ParameterType;
            szLeftName = string.Format("arg{0}", i);
            if (param.IsOut || nParamType.IsByRef)
            {
                FCValueType value = PushOutParamWrap(nParamType);
                fileData.Append(FCValueType.ModifyScriptCallParam("            ", value, szLeftName, "L", i.ToString(), true));
            }
        }
        // 处理返回值
        if (ret_value.m_nValueType != fc_value_type.fc_value_void)
        {
            FCValueType.PushReturnValue(fileData, "            ", ret_value, "L", "ret", false);
        }
        fileData.AppendLine("        }");
        fileData.AppendLine("        catch(Exception e)");
        fileData.AppendLine("        {");
        fileData.AppendLine("            Debug.LogException(e);");
        fileData.AppendLine("        }");
        fileData.AppendLine("        return 0;");
        fileData.AppendLine("    }");

        func.m_szContent = fileData.ToString();
        if (nFuncCount > 1)
        {
            func.m_szRegister = string.Format("FCLibHelper.fc_register_class_func(nClassName,\"{0}\",{1});", szFullFuncName, func.m_szGetName);
        }
        else
        {
            func.m_szRegister = string.Format("FCLibHelper.fc_register_class_func(nClassName,\"{0}\",{1});", func.m_szName, func.m_szGetName);
        }
        m_CurClassFunc.Add(func);
    }
Exemplo n.º 9
0
    void MakeParamNew(ConstructorInfo conInfo, int nFuncIndex)
    {
        ParameterInfo[] allParams = conInfo.GetParameters();
        if (allParams == null || allParams.Length == 0)
        {
            MakeDefNew();
            return;
        }

        m_szTempBuilder.Length = 0;
        StringBuilder fileData = m_szTempBuilder;

        fileData.AppendLine("    [MonoPInvokeCallbackAttribute(typeof(FCLibHelper.fc_call_back_inport_class_func))]");
        fileData.AppendFormat("    public static int  obj_new{0}(long L)\r\n", nFuncIndex);
        fileData.AppendLine("    {");
        fileData.AppendLine("        try");
        fileData.AppendLine("        {");
        string szCallParam = string.Empty;
        Type   nParamType;
        string szLeftName = string.Empty;

        for (int i = 0; i < allParams.Length; ++i)
        {
            ParameterInfo param = allParams[i];
            nParamType = param.ParameterType;

            FCValueType param_value = FCTemplateWrap.Instance.PushGetTypeWrap(nParamType);

            szLeftName = string.Format("arg{0}", i);
            if (param.IsOut)
            {
                string szCSharpName = param_value.GetTypeName(true);
                fileData.AppendFormat("            {0} {1};\r\n", szCSharpName, szLeftName);
            }
            else
            {
                SetMemberValue(fileData, "            ", param_value, szLeftName, "L", i.ToString(), true, param.IsOut);
            }
            if (i > 0)
            {
                szCallParam += ',';
            }
            if (param.IsOut)
            {
                szCallParam += "out ";
            }
            else if (nParamType.IsByRef)
            {
                szCallParam += "ref ";
            }
            szCallParam += szLeftName;
        }
        fileData.AppendFormat("            {0} obj = new {1}({2});\r\n", m_szCurClassName, m_szCurClassName, szCallParam);
        fileData.AppendFormat("            long nPtr = FCGetObj.PushNewObj<{0}>(obj);\r\n", m_szCurClassName);
        fileData.AppendLine("            long ret = FCLibHelper.fc_get_return_ptr(L);");
        fileData.AppendLine("            FCLibHelper.fc_set_value_intptr(ret, nPtr);");
        fileData.AppendLine("        }");
        fileData.AppendLine("        catch(Exception e)");
        fileData.AppendLine("        {");
        fileData.AppendLine("            Debug.LogException(e);");
        fileData.AppendLine("        }");
        fileData.AppendLine("        return 0;");
        fileData.AppendLine("    }");

        WrapFuncDesc func = new WrapFuncDesc();

        func.m_szName     = m_szCurClassName;
        func.m_szGetName  = func.m_szSetName = string.Format("obj_new{0}", nFuncIndex);
        func.m_bAttrib    = false;
        func.m_szContent  = fileData.ToString();
        func.m_szRegister = string.Format("FCLibHelper.fc_register_class_func(nClassName, \"{0}\", {1});", m_szCurClassName, func.m_szGetName);
        m_CurClassFunc.Insert(0, func);
    }
Exemplo n.º 10
0
    // 功能:添加函数调用的方法
    void PushMethodInfo(MethodInfo method)
    {
        if (0 != (MethodAttributes.SpecialName & method.Attributes))
        {
            return;
        }
        if (m_bPartWrap)
        {
            if (!method.IsDefined(typeof(PartWrapAttribute), false))
            {
                return;
            }
        }
        // 如果该函数有不导出的标记
        if (method.IsDefined(typeof(DontWrapAttribute), false))
        {
            return;
        }
        if (method.IsDefined(typeof(ObsoleteAttribute), false))
        {
            return;
        }

        // 模板函数不导出了吧
        if (IsTemplateFunc(method))
        {
            return;
        }
        bool   bStatic  = method.IsStatic;
        string szStatic = string.Empty;

        if (bStatic)
        {
            szStatic = "static ";
        }
        ParameterInfo[] allParams   = method.GetParameters(); // 函数参数
        string          szCallParam = string.Empty;

        if (allParams != null)
        {
            Type   nParamType;
            string szParamType = string.Empty;
            for (int i = 0; i < allParams.Length; ++i)
            {
                nParamType = allParams[i].ParameterType;
                if (i > 0)
                {
                    szCallParam += ',';
                }
                PushNameSpace(nParamType.Namespace);
                PushRefType(nParamType);
                FCValueType value = FCValueType.TransType(nParamType);
                szCallParam += value.GetTypeName(false);
                szCallParam += " ";
                szCallParam += allParams[i].Name;
            }
        }
        PushNameSpace(method.ReturnType.Namespace);
        PushRefType(method.ReturnType);
        FCValueType ret_value = FCValueType.TransType(method.ReturnType);

        if (ret_value.m_nTemplateType != fc_value_tempalte_type.template_none)
        {
            m_szTempBuilder.AppendFormat("    public {0}{1} {2}({3}){{ return null; }}\r\n", szStatic, ret_value.GetTypeName(false), method.Name, szCallParam);
        }
        else if (ret_value.m_nValueType == fc_value_type.fc_value_void)
        {
            m_szTempBuilder.AppendFormat("    public {0}{1} {2}({3}){{}}\r\n", szStatic, ret_value.GetTypeName(false), method.Name, szCallParam);
        }
        else
        {
            string szRetCShaprName = ret_value.GetTypeName(true);
            m_szTempBuilder.AppendFormat("    public {0}{1} {2}({3}){{ return default({4}); }}\r\n", szStatic, ret_value.GetTypeName(false), method.Name, szCallParam, szRetCShaprName);
        }
    }