Esempio n. 1
0
 private void DefineRawObjectClass(CodeWriter writer)
 {
     writer.NewLine();
     writer.Write($"class {RawName}");
     if (BaseClassRawCppName != null)
     {
         writer.Write(": public ");
         writer.Write(BaseClassRawCppName);
     }
     else
     {
         writer.Write(": public e::system::basic_object");
     }
     using (writer.NewBlock())
     {
         writer.NewLine();
         if (RawInfo.Variables.Length != 0)
         {
             writer.Write("private:");
             P.DefineVariable(writer, null, RawInfo.Variables, false);
         }
         writer.NewLine();
         writer.Write("public:");
         writer.NewLine();
         writer.Write($"{RawName}();");
         writer.NewLine();
         writer.Write($"{RawName}(const {RawName}&);");
         writer.NewLine();
         writer.Write($"virtual ~{RawName}();");
         writer.NewLine();
         writer.Write($"virtual e::system::basic_object* __stdcall clone();");
         foreach (var item in Method)
         {
             item.DefineItem(writer);
         }
     }
     writer.Write(";");
 }
Esempio n. 2
0
 private void DefineRawName(CodeWriter writer)
 {
     writer.NewLine();
     writer.Write($"class {RawName};");
 }
Esempio n. 3
0
 private void DefineName(CodeWriter writer)
 {
     writer.NewLine();
     writer.Write($"typedef e::system::object_ptr<{RawCppName}> {Name};");
 }
Esempio n. 4
0
        private void DefineStructMarshaler(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write("template<> struct marshaler<");
            writer.Write(CppName);
            writer.Write(">");
            using (writer.NewBlock())
            {
                writer.NewLine();
                writer.Write("private: ");

                writer.NewLine();
                writer.Write("using ManagedType = ");
                writer.Write(CppName);
                writer.Write(";");

                writer.NewLine();
                writer.Write("public: ");

                writer.NewLine();
                writer.Write("static constexpr bool SameMemoryStruct = false;");

                writer.NewLine();
                writer.Write("#pragma pack(push)");
                writer.NewLine();
                writer.Write("#pragma pack(1)");

                writer.NewLine();
                writer.Write("struct NativeType");
                WriteStructMarshalerCodeBlock(writer, "DefineMember");
                writer.Write(";");

                writer.NewLine();
                writer.Write("#pragma pack(pop)");

                writer.NewLine();
                writer.Write("static void marshal(NativeType &v, ManagedType &r)");
                WriteStructMarshalerCodeBlock(writer, "MarshalMember");
                writer.Write(";");

                writer.NewLine();
                writer.Write("static void cleanup(NativeType &v, ManagedType &r)");
                WriteStructMarshalerCodeBlock(writer, "CleanupMember");
                writer.Write(";");
            }
            writer.Write(";");
        }
Esempio n. 5
0
 public void Dispose()
 {
     writer.Indent--;
     writer.NewLine();
     writer.Write("}");
 }
Esempio n. 6
0
        internal void WriteMethodHeader(CodeWriter writer, EocCmdInfo eocCmdInfo, string name, bool isVirtual, string className = null, bool writeDefaultValue = true)
        {
            var paramName = GetParamNameFromInfo(eocCmdInfo.Parameters);

            writer.NewLine();
            if (isVirtual)
            {
                writer.Write("virtual ");
            }

            var numOfOptionalAtEnd = 0;

            for (int i = eocCmdInfo.Parameters.Count - 1; i >= 0; i--)
            {
                if (eocCmdInfo.Parameters[i].Optional)
                {
                    numOfOptionalAtEnd++;
                }
                else
                {
                    break;
                }
            }
            var startOfOptionalAtEnd = eocCmdInfo.Parameters.Count - numOfOptionalAtEnd;

            writer.Write(eocCmdInfo.ReturnDataType == null ? "void" : eocCmdInfo.ReturnDataType.ToString());
            writer.Write(" __stdcall ");
            if (className != null)
            {
                writer.Write(className);
                writer.Write("::");
            }
            writer.Write(name);
            writer.Write("(");
            for (int i = 0; i < eocCmdInfo.Parameters.Count; i++)
            {
                if (i != 0)
                {
                    writer.Write(", ");
                }
                writer.Write(GetParameterTypeString(eocCmdInfo.Parameters[i]));
                writer.Write(" ");
                writer.Write(paramName[i]);
                if (writeDefaultValue && i >= startOfOptionalAtEnd)
                {
                    writer.Write(" = std::nullopt");
                }
            }
            writer.Write(")");
        }
Esempio n. 7
0
 internal void DefineMethod(CodeWriter writer, EocCmdInfo eocCmdInfo, string name, bool isVirtual)
 {
     WriteMethodHeader(writer, eocCmdInfo, name, isVirtual, null, true);
     writer.Write(";");
 }
Esempio n. 8
0
        private void MakeProgramEntry(CodeWriter writer)
        {
            writer.Write("#include \"stdafx.h\"");
            writer.NewLine();
            writer.Write("#include <Windows.h>");
            writer.NewLine();
            writer.Write("int init()");
            using (writer.NewBlock())
            {
                if (Source.InitEcSectionInfo != null)
                {
                    for (int i = 0; i < Source.InitEcSectionInfo.InitMethod.Length; i++)
                    {
                        writer.NewLine();
                        writer.Write(GetCppMethodName(Source.InitEcSectionInfo.InitMethod[i]));
                        writer.Write("();");
                        writer.AddComment("为{" + Source.InitEcSectionInfo.EcName[i] + "}做初始化");
                    }
                }
                if (Source.Code.MainMethod != 0)
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.Write(GetCppMethodName(Source.Code.MainMethod));
                    writer.Write("();");
                }
                else
                {
                    writer.NewLine();
                    writer.Write("return e::user::cmd::_启动子程序();");
                }
            }
            switch (ProjectType)
            {
            case EocProjectType.Windows:
                writer.NewLine();
                writer.Write("int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Console:
                writer.NewLine();
                writer.Write("int main()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            default:
                throw new Exception("未知项目类型");
            }
        }
Esempio n. 9
0
        private void MakeProgramEntry(CodeWriter writer)
        {
            writer.Write("#include \"stdafx.h\"");
            writer.NewLine();
            writer.Write("#include <Windows.h>");
            writer.NewLine();
            writer.Write("int init()");
            using (writer.NewBlock())
            {
                if (Source.InitEcSectionInfo != null)
                {
                    for (int i = 0; i < Source.InitEcSectionInfo.InitMethod.Length; i++)
                    {
                        writer.NewLine();
                        writer.Write(GetCppMethodName(Source.InitEcSectionInfo.InitMethod[i]));
                        writer.Write("();");
                        writer.AddComment("为{" + Source.InitEcSectionInfo.EcName[i] + "}做初始化");
                    }
                }
                if (Source.Code.MainMethod != 0)
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.Write(GetCppMethodName(Source.Code.MainMethod));
                    writer.Write("();");
                }
                else
                {
                    writer.NewLine();
                    writer.Write("return e::user::cmd::EocUser__启动子程序();");
                }
            }
            switch (ProjectType)
            {
            case EocProjectType.Windows:
                writer.NewLine();
                writer.Write("int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Console:
                writer.NewLine();
                writer.Write("int main()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Dll:
                writer.NewLine();
                writer.Write("BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("switch(ul_reason_for_call)");
                    using (writer.NewBlock())
                    {
                        writer.NewLine();
                        writer.Write("case DLL_PROCESS_ATTACH:");
                        writer.NewLine();
                        writer.Write("init();");
                        writer.NewLine();
                        writer.Write("break;");
                    }
                    writer.NewLine();
                    writer.Write("return TRUE;");
                }
                break;

            default:
                throw new Exception("未知项目类型");
            }
        }
Esempio n. 10
0
        private void ImplementItem(ProjectConverter P, CodeWriter writer)
        {
            var paramName = P.GetParamNameFromInfo(Info.Parameters);

            writer.NewLine();
            writer.Write(Info.ReturnDataType == null ? "void" : $"typename e::system::MethodPtrPackager_Result<{Info.ReturnDataType}>::NativeType");
            writer.Write(" __stdcall ");
            writer.Write("eoc_export_");
            writer.Write(ExportId);
            writer.Write("(");
            for (int i = 0; i < Info.Parameters.Count; i++)
            {
                if (i != 0)
                {
                    writer.Write(", ");
                }
                writer.Write("typename e::system::MethodPtrPackager_Arg<");
                writer.Write(P.GetParameterTypeString(Info.Parameters[i]));
                writer.Write(">::NativeType ");
                writer.Write(paramName[i]);
            }
            writer.Write(")");
            using (writer.NewBlock())
            {
                writer.NewLine();
                writer.Write("return e::system::MethodPtrPackager<");
                writer.Write(Info.ReturnDataType == null ? "void" : Info.ReturnDataType.ToString());
                writer.Write("(");
                writer.Write(string.Join(", ", Info.Parameters.Select(x => P.GetParameterTypeString(x))));
                writer.Write(")");
                writer.Write(">::func<&" + Info.CppName + ">");
                writer.Write("(");
                writer.Write(string.Join(", ", paramName));
                writer.Write(");");
            }
        }