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(";"); }
private void DefineRawName(CodeWriter writer) { writer.NewLine(); writer.Write($"class {RawName};"); }
private void DefineName(CodeWriter writer) { writer.NewLine(); writer.Write($"typedef e::system::object_ptr<{RawCppName}> {Name};"); }
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(";"); }
public void Dispose() { writer.Indent--; writer.NewLine(); writer.Write("}"); }
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(")"); }
internal void DefineMethod(CodeWriter writer, EocCmdInfo eocCmdInfo, string name, bool isVirtual) { WriteMethodHeader(writer, eocCmdInfo, name, isVirtual, null, true); writer.Write(";"); }
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("未知项目类型"); } }
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("未知项目类型"); } }
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(");"); } }