}
void CsStubGen::GenInterface(std::ofstream& stream, const Interface& iface) {
- stream << Tab(2) << "public sealed class " << iface.GetID() << NLine(1);
+ stream << Tab(2) << "public sealed class " << iface.GetID()
+ << " : IDisposable" << NLine(1);
GenBrace(stream, TAB_SIZE * 2, [&]() {
stream << Tab(3) << "private IntPtr _stub;" << NLine(1);
stream << Tab(3)
GenDisconnectedEvent(stream);
GenCtor(stream, iface);
GenCommonMethods(stream);
+ GenDisposable(stream, iface);
});
}
" protected ServiceBase()\n" \
" {\n" \
" }\n" \
- "\n";
-
+ "\n" \
+ " public abstract void OnCreate();\n" \
+ " public abstract void OnTerminate();\n";
stream << AddIndent(TAB_SIZE * 3, cls);
GenDeclarations(stream, iface.GetDeclarations());
stream << NLine(1);
"{\n" \
" ServiceBase s = Activator.CreateInstance(_serviceType) as ServiceBase;\n" \
" s.Sender = sender;\n" \
+ " s.OnCreate();\n" \
" _services.Add(s);\n" \
"}\n";
stream << AddIndent(TAB_SIZE * 3, method) << NLine(1);
" {\n" \
" if (i.Sender.Equals(sender))\n" \
" {\n" \
+ " i.OnTerminate();\n" \
" _services.Remove(i);\n" \
" break;\n" \
" }\n" \
stream << AddIndent(TAB_SIZE * 3, method_get_services);
}
+void CsStubGen::GenDisposable(std::ofstream& stream, const Interface& iface) {
+ const char* m =
+ "#region IDisposable Support\n" \
+ "private bool disposedValue = false;\n" \
+ "\n" \
+ "private void Dispose(bool disposing)\n" \
+ "{\n" \
+ " if (!disposedValue)\n" \
+ " {\n" \
+ " if (disposing)\n" \
+ " {\n" \
+ " }\n" \
+ "\n" \
+ " foreach (var i in _services)\n" \
+ " {\n" \
+ " i.OnTerminate();\n" \
+ " }\n" \
+ "\n" \
+ " _services = null;\n" \
+ " if (_stub != null)\n" \
+ " Interop.LibRPCPort.Stub.Destroy(_stub);\n" \
+ " disposedValue = true;\n" \
+ " }\n" \
+ "}\n" \
+ "\n" \
+ "~$$() {\n" \
+ " Dispose(false);\n" \
+ "}\n" \
+ "\n" \
+ "public void Dispose()\n" \
+ "{\n" \
+ " Dispose(true);\n" \
+ " GC.SuppressFinalize(this);\n" \
+ "}\n" \
+ "#endregion\n";
+
+ GenTemplate(AddIndent(TAB_SIZE * 3, m), stream,
+ [&]()->std::string {
+ return iface.GetID();
+ }
+ );
+
+}
+
} // namespace tidl