From b931b773ebbd4b67cc5c39e11ea990dfec1eaf07 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 5 Jul 2017 10:44:22 +0200 Subject: [PATCH] - C# API: server - keep references to internal control handler delegates to avoid garbage collection --- dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs index b3fbc53..fc08dd8 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs @@ -659,7 +659,9 @@ namespace IEC61850 private IntPtr self = IntPtr.Zero; - + private InternalControlHandler internalControlHandlerRef = null; + private InternalControlPerformCheckHandler internalControlPerformCheckHandlerRef = null; + private InternalControlWaitForExecutionHandler internalControlWaitForExecutionHandlerRef = null; private class ControlHandlerInfo { public DataObject controlObject = null; @@ -884,7 +886,10 @@ namespace IEC61850 info.controlHandler = handler; info.controlHandlerParameter = parameter; - IedServer_setControlHandler(self, controlObject.self, internalControlHandler, GCHandle.ToIntPtr(info.handle)); + if (internalControlHandlerRef == null) + internalControlHandlerRef = new InternalControlHandler (internalControlHandler); + + IedServer_setControlHandler(self, controlObject.self, internalControlHandlerRef, GCHandle.ToIntPtr(info.handle)); } public void SetCheckHandler (DataObject controlObject, CheckHandler handler, object parameter) @@ -894,7 +899,10 @@ namespace IEC61850 info.checkHandler = handler; info.checkHandlerParameter = parameter; - IedServer_setPerformCheckHandler(self, controlObject.self, internalCheckHandler, GCHandle.ToIntPtr(info.handle)); + if (internalControlPerformCheckHandlerRef == null) + internalControlPerformCheckHandlerRef = new InternalControlPerformCheckHandler (internalCheckHandler); + + IedServer_setPerformCheckHandler(self, controlObject.self, internalControlPerformCheckHandlerRef, GCHandle.ToIntPtr(info.handle)); } public void SetWaitForExecutionHandler (DataObject controlObject, ControlWaitForExecutionHandler handler, object parameter) @@ -904,7 +912,10 @@ namespace IEC61850 info.waitForExecHandler = handler; info.waitForExecHandlerParameter = parameter; - IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandler, GCHandle.ToIntPtr(info.handle)); + if (internalControlWaitForExecutionHandlerRef == null) + internalControlWaitForExecutionHandlerRef = new InternalControlWaitForExecutionHandler (internalControlWaitForExecutionHandler); + + IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandlerRef, GCHandle.ToIntPtr(info.handle)); } public void HandleWriteAccess (DataAttribute dataAttr, WriteAccessHandler handler, object parameter)