{"id":21528278,"url":"https://github.com/masesgroup/jcobridge-examples","last_synced_at":"2025-08-14T19:14:36.237Z","repository":{"id":45970128,"uuid":"175057707","full_name":"masesgroup/JCOBridge-Examples","owner":"masesgroup","description":"The repository contains examples files to use with JCOBridge. The examples are ready to run.","archived":false,"fork":false,"pushed_at":"2023-11-16T00:49:11.000Z","size":1495,"stargazers_count":11,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-09T23:43:32.014Z","etag":null,"topics":["awt","clr","csharp","dotnet","java","java-application","jvm","jvm-languages","jvm-scala","scala","swing-window","visual-basic","wpf"],"latest_commit_sha":null,"homepage":"https://www.jcobridge.com","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/masesgroup.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-11T18:11:41.000Z","updated_at":"2024-07-11T09:09:56.000Z","dependencies_parsed_at":"2024-11-24T02:15:24.413Z","dependency_job_id":null,"html_url":"https://github.com/masesgroup/JCOBridge-Examples","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/masesgroup/JCOBridge-Examples","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masesgroup%2FJCOBridge-Examples","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masesgroup%2FJCOBridge-Examples/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masesgroup%2FJCOBridge-Examples/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masesgroup%2FJCOBridge-Examples/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/masesgroup","download_url":"https://codeload.github.com/masesgroup/JCOBridge-Examples/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masesgroup%2FJCOBridge-Examples/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270468693,"owners_count":24589032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-14T02:00:10.309Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["awt","clr","csharp","dotnet","java","java-application","jvm","jvm-languages","jvm-scala","scala","swing-window","visual-basic","wpf"],"created_at":"2024-11-24T01:52:28.817Z","updated_at":"2025-08-14T19:14:36.215Z","avatar_url":"https://github.com/masesgroup.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JCOBridge Examples\n\n## JCOBridge main features\n\n### Field proven\n\nBuilt on top of the field proven DLR plugin available in the [Sinapse platform](https://www.sinapsesystem.com), JCOBridge guarantees the best performance in JVM and CLR worlds integration.\n\n### JVM ( Available only for .NET Framework on https://www.jcobridge.com, .NET Core available on supported OS and Architectures)\n\u003e- Retrieve CLR Type\n\u003e- Instantiate CLR object\n\u003e- Invoke static methods\n\u003e- Invoke instance methods\n\u003e- Get/Set static properties\n\u003e- Get/Set instance properties\n\u003e- Set Delegates\n\u003e- Subscribe/Unsubscribe events\n\u003e- Integrates WPF controls into AWT/Swing window\n\u003e- Integrate WinForms controls into AWT/Swing window\n\u003e- Integrate complex .NET Graphical user interfaces objects into AWT/Swing window\n\u003e- User interface Controls, properties and events management\n\n### CLR ( Available for .NET Framework on Windows and .NET Core on Windows and Linux, other platforms available on demand )\n\u003e- Retrieve JVM class\n\u003e- Instantiate JVM objects\n\u003e- Invoke static methods\n\u003e- Invoke instance methods\n\u003e- Get/Set static fields\n\u003e- Get/Set instance fields\n\u003e- Use dynamic access to write code in a seamless way as it is done in Java language\n\u003e- Use specific interface to direct manages methods and fields\n\n# JCOBridge Examples\n\nJCOBridge (JVM-CLR Object Bridge) allows the execution of JVM native languages, like java and scala, from CLR/.NET languages and vice-versa, it allows to import and use libraries, components and also to manage graphical user interface from one programming world to the other.\nMore information on [www.jcobridge.com](https://www.jcobridge.com)\n\n## The Short way\n\nTo explore the examples you need to perform the following steps:\n1. Download the last trial release from this [link](https://www.jcobridge.com/wpdownloads/)\n2. Install it following the wizard\n3. Clone this repository\n4. Use directly the executables ready into Output directories, or\n5. Enjoy the jcobridge with your preferred development tools\n\n## Repository Content\n\nIn this repository it is possible to find example code for the different programming language supported by JCObridge. \nThe examples are organized in two main folder, JVM and CLR that contains the relative projects. Before execute the code is needed that examples of both world are compiled, because no runtime compilation of foreign code is done, only execution. \n\n## .NET to Java Examples\n\n### .NET Core Linux/Windows Graphical User Interface example\n\nThe project [Cross Platform GUI](/CLR/CoreCLR/crossPlatformGUIExample/README.md) shows how to use AWT to create a cross-platform graphical user interface for .NET Core on Windows and Linux hosts. To use Swing simply change the controls within the code to your preferred ones.\n\n### Java Class Use Example\n\nThis is a basic example where we call the simple class defined in JavaClass.java from a .NET application.\nin the /JVM/java/src/JavaClass.java we have a simple class\n\n```Java\npublic class JavaClass {\n    /**\n     * This simple method return the \"Hello World!!\" string\n     * * @return \"Hello World!!\" string\n     */\n    public String helloWorld()\n    {\n        return \"Hello World from Java!!\";\n    }\n    \n    /**\n     * This simple method return the sum of two double\n     * @param a\n     * @param b\n     * @return a + b\n     */\n    public double add(double a, double b)\n    {\n        return a+b;\n    }\n    \n    /**\n     * This simple method return the sin of a double\n     * @param a\n     * @return sin of a\n     */\n    public double sin(double a)\n    {\n        return Math.sin(a);\n    }\n}\n```\nin the \\CLR\\JavaClassUseExample\\program.cs we have the simple .NET C# application\n\n```c#\nusing MASES.LicenseManager.Common;\nusing MASES.JCBridge.C2JBridge;\nusing System;\n\nnamespace JavaClassUseExample\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            new TestClass().Execute();\n        }\n\n        class TestClass : SetupJVMWrapper\n        {\n            public override string ClassPath { get { return @\"..\\..\\JVM\\Output\"; } }\n\n            public void Execute()\n            {\n                double a = 2;\n                double b = 3;\n                double c = Math.PI/2;\n                var javaClass = DynJVM.JavaClass.@new();\n                string hello = javaClass.helloWorld();\n                double result = javaClass.add(a, b);\n                double sin = javaClass.sin(c);\n                Console.WriteLine(\"{0} {1} + {2} = {3} and sin({4:0.0000000}) = {5:0.00000000}\", hello, a, b, result, c, sin);\n            }\n        }\n    }\n}\n\n```\nExecuting the code we have the following output:\n```\nHello World from Java!! 2 + 3 = 5 and sin(3,1415927) = 1,00000000\n```\n\n### JVM Environment Example\n\nThis example is an extension of the _Java Class Use Example_ where Environment parameters are configured in the .NET _TestClass_ class.\n\n```c#\n\nclass TestClass : SetupJVMWrapper\n{\n    // the following line setup the classpath where JVM will search for classes\n    // during runtime it is possible to dynamically add other path using a call like DynJVM.JVMHelper.addPath(\u003cthe path to add\u003e);\n    public override string ClassPath { get { return @\"C:\\Program Files\\MASES Group\\JCOB\\Core;..\\..\\JVM\\Java\\Output\"; } }\n\n    // uncomment the following line and set the correct JRE if the automatic search system fails\n    // public override string JVMPath { get { return @\"C:\\Program Files\\Java\\jre1.8.0_121\\bin\\server\\jvm.dll\"; } }\n\n    // the following code adds all possible switch to the starting JVM.\n    // for a complete list see Oracle documentation: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html\n    public override IEnumerable\u003cKeyValuePair\u003cstring, string\u003e\u003e JVMOptions\n    {\n        get\n        {\n            var dict = new Dictionary\u003cstring, string\u003e();\n            dict.Add(\"-Xmx128M\", null); // this line adds a complete argument\n            // dict.Add(property, value); // this line adds an argument like -Dproperty = value\n\n            return dict;\n        }\n    }\n\n    // the following code adds initial packages to the import statement.\n    public override IEnumerable\u003cstring\u003e JVMPackages\n    {\n        get\n        {\n            var list = new List\u003cstring\u003e();\n            list.Add(\"java.lang\"); // this line adds java.lang.* like you do with \"import java.lang.*\" in Java\n            return list;\n        }\n    }\n\n    // uncomment and set the following line when you need features of JDK like the use of the compiler\n    // public override string JDKHome { get { return @\"C:\\Program Files\\Java\\jdk1.8.0_121\\\"; } }\n\n    public void Execute()\n    {\n        double a = 2;\n        double b = 3;\n        double c = Math.PI/2;\n        var javaClass = DynJVM.JavaClass.@new();\n        string hello = javaClass.helloWorld();\n        double result = javaClass.add(a, b);\n        double sin = javaClass.sin(c);\n        Console.WriteLine(\"{0} {1} + {2} = {3} and sin({4:0.0000000}) = {5:0.00000000}\", hello, a, b, result, c, sin);\n        Console.WriteLine(\"Press Enter to exit\");\n        Console.ReadLine();\n    }\n}\n\n```\n### ConsoleTest\n\nThis is a more complex application that explores the ability of JCOBridge doing the following operations:\n-Execute java code in the .NET environment using the _Dynamic JVM wrapper_\n-Manage shared object\n-Register CLR object in the Java Virtual Machine side\n-Use the registered object from the JVM side\n-Call Methods on the JVM registered class and have the operation reflected to the CLR object\n-Create dialog in the JVM side and use it from the .NET code\n\n## .NET Libraries for use within the _Java to .NET Examples_\n\n### CSharpClass\n\nThis library contain a single class that provide double and string operations to be called from JVM.\n\n### WinFormsTestControl\n\nA Windows Form panel with his complete logic that will be used to demonstrate _User Interface Integration_ in a Java Graphical application.\n\n### WPFTestControl\n\nA WPF panel with his complete logic that will be used to demonstrate _User Interface Integration_ in a Java Graphical application.\n\n## Java to .NET Examples\n\n### CSharp Class Use Examples\n\nThis is a basic example where we call the simple class defined in CSharpClass.cs from a Java application.\nin the \\CLR\\CSharpClass\\CSharpClass.cs we have a simple class\n\n```c#\nusing System;\n\nnamespace MASES.CLRTests\n{\n    public class CSharpClass\n    {\n        /// \u003csummary\u003eThe method \u003cc\u003eHelloWorld\u003c/c\u003e return the \"Hello World!!\" string\u003c/summary\u003e\n        public String HelloWorld()\n        {\n            return \"Hello World from C#!!\";\n        }\n\n        /// \u003csummary\u003eThe method \u003cc\u003eAdd\u003c/c\u003e return the sum of two double\u003c/summary\u003e\n        public double Add(double a, double b)\n        {\n            return a + b;\n        }\n\n        /// \u003csummary\u003eThe method \u003cc\u003eAdd\u003c/c\u003e return the sin of a double\u003c/summary\u003e\n        public double Sin(double a)\n        {\n            return Math.Sin(a);\n        }\n    }\n}\n```\n\nin the /JVM/src/JavaClass.java we have the simple Java application\n```java\nimport java.io.IOException;\nimport org.mases.jcobridge.*;\n\npublic class CSharpClassUseExample {\n\n    public static void main(String[] args) {\n        try {\n            try {\n                try {\n                    JCOBridge.Initialize(\"\");\n                    } catch (JCException e) {\n                        e.printStackTrace();\n                    }\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n                //declare and create JCOBridge instance\n                JCOBridge bridge;\n                bridge = JCOBridge.CreateNew();\n                // adds the path where extarnal assemblies where found\n                bridge.AddPath(\"../CLR/Output/\");\n                // add REFERENCES to the .dll file\n                bridge.AddReference(\"CSharpClass\");\n                // GENERATE Object\n                JCObject CSharpObject = (JCObject) bridge.NewObject(\"MASES.CLRTests.CSharpClass\");\n                double a = 2;\n                double b = 3;\n                double c = Math.PI/2;\n                //Invoke the C# class methods\n                String hello = (String) CSharpObject.Invoke(\"HelloWorld\");\n                double result = (double) CSharpObject.Invoke(\"Add\",a, b);\n                double sin = (double) CSharpObject.Invoke(\"Sin\", c);\n                System.out.println(String.format(\"%s %.0f + %.0f = %.0f and sin(%.8f) = %.8f\", hello, a, b, result, c, sin));\n            \n            } catch (JCException jce) {\n            jce.printStackTrace();\n            System.out.println(\"Exiting\");\n            return;\n        }\n    }\n}\n```\nExecuting the code we have the following output:\n```\nHello World from C#!! 2 + 3 = 5 and sin(3,14159265) = 1,00000000\n```\n\n### Windows Forms and WPF User Interface Integration\n\nIn this little more complex example we integrate into an awt java user interface two different complex control, taken from two .NET library. \nThe first control is a Windows Form, the second one is a WPF object. \nThe application in \\JVM\\Java\\srcAWTWinFormsWPF.java expose the complete process from the control reference and generation to the .NET event listener registration to the .NET events callback management.\n\n```java\nimport java.awt.Frame;\nimport java.io.IOException;\nimport org.mases.jcobridge.*;\n\npublic class AWTWinFormsWPF implements IJCVoidEventEmit {\n    public static void main(String args[]) {\n        new AWTWinFormsWPF().createAndShow();\n    }\n\n    int cycle = 0;\n    java.awt.TextArea gTextArea;\n\n    // WPF\n    JCControl gControlWpfControl = null;\n\n    // FORMS\n    JCControl gControlFormsControl = null;\n\n    void createAndShow() {\n        try {\n            // LOGGER\n            IJCEventLog logger = null;\n            try {\n                try {\n                    JCOBridge.Initialize(\"\");\n                } catch (JCException e) {\n                    e.printStackTrace();\n                }\n\n                logger = new JCFileEventLog(\"WinFormsWPF.txt\");\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n\n            JCOBridge bridge;\n\n            bridge = JCOBridge.CreateNew();\n            bridge.RegisterEventLog(logger);\n            // adds the path where extarnal assemblies where found\n            bridge.AddPath(\"../../CLR/Output/\");\n\n            // add REFERENCES\n            bridge.AddReference(\"WPFTestControl\");\n            bridge.AddReference(\"WinFormsTestControl\");\n\n            // GENERATE CONTROLS\n            gControlWpfControl = bridge.GetControl(\"MASES.CLRTests.WPFTestControl.TestControl\");\n            gControlFormsControl = bridge.GetControl(\"MASES.CLRTests.WinFormsTestControl.TestControl\");\n\n            // CONFIGURE CONTROLS\n            gControlWpfControl.RegisterEventListener(\"FromComboBox\", this);\n            gControlWpfControl.RegisterEventListener(\"FromTextBox\", this);\n\n            gControlFormsControl.RegisterEventListener(\"FromComboBox\", this);\n            gControlFormsControl.RegisterEventListener(\"FromTextBox\", this);\n\n            Frame dialog = new Frame();\n            gTextArea = new java.awt.TextArea();\n            gTextArea.setText(\"This is an AWT TextArea\");\n\n            java.awt.GridLayout layout = new java.awt.GridLayout(2, 2);\n\n            dialog.setLayout(layout);\n            dialog.add(gControlWpfControl);\n            dialog.add(gControlFormsControl);\n            dialog.add(gTextArea);\n            dialog.validate();\n            dialog.setTitle(\"WinForms-WPF AWT integration\");\n            dialog.setVisible(true);\n            dialog.setSize(200, 200);\n\n        } catch (JCException jce) {\n            jce.printStackTrace();\n            System.console().readLine(\"Please press enter\");\n\n            System.out.println(\"Exiting\");\n            return;\n        }\n    }\n\n    @Override\n    public void EventRaised(Object... args) {\n        System.out.println(\"EventRaised\");\n        if (args[1] instanceof JCObject) {\n            JCObject obj = (JCObject) args[1];\n            System.out.println();\n            try {\n                if (obj != null) {\n                    gTextArea.setText(\"Text area: event: \" + obj.toString() + \" Content: \" + obj.Get(\"Content\"));\n                }\n            } catch (JCException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n}\n```\n## Classes to be used from the CLR test applications\n\n### JavaClass\n\nA single class that provide double and string operations to be called from the .NET CLR.\n\n### GlobalVariableTest\n\nA class that contains two methods and display how to register and use Shared global variables and object\n\n```java\nimport org.mases.jcobridge.*;\nimport java.awt.*;\n\npublic class GlobalVariableTest\n{\n    public static void createGlobal() throws JCException\n    {\n        Dialog dialog = new Dialog((Dialog)null);\n        JCOBridge.RegisterJVMGlobal(\"SharedDialog\", dialog);\n    }\n    \n    public static void testMyCLRClass(Integer a, Integer b) throws JCException\n    {\n        JCObject resultGetCLRObject = (JCObject)JCOBridge.GetCLRGlobal(\"MyCLRClass\");\n        resultGetCLRObject.Invoke(\"Add\", a, b);\n    }\n}\n```\nThe createGlobal method create a global awt dialog and register it to be used seamlessly from the CLR side.\nThe testMyCLRClass show how to use a registered CLR global object, in the CLR example we create this object from the .NET side and we call this function to use it and demonstrate hot operations are reflected between JVM and CLR in a transparent manner. \n\n## .NET to Scala Example\n\nA simple Scala class is defined to be used from CLR in JVM\\Scala\\scalaclass\\src\\main\\scala\\ScalaClass.class\nCall compile and execute batch script in JVM\\Scala\\\nBefore call compile and execute batch script Scala [binaries](https://downloads.lightbend.com/scala/2.12.8/scala-2.12.8.msi) shall be installed.\n\n```java\nimport java.lang._\n\nfinal class ScalaClass(aString: String, val anInteger: Int) {\n    def this() {\n        this(\"defaultString\", -1)\n    }\n\n    def this(aBool: Boolean) {\n        this(\"defaultString\", -1)\n    }\n\n    val scalaString = \"This is a Scala String\"\n\n    def add(x: Int, y: Int): Int = x + y\n\n    def stringConcat(args: Array[String]): String = \n    {\n        return args.mkString(\", \")\n    }\n}\n```\n\nIn the \\CLR\\ScalaClassUseExample\\Program.cs we have a simple application that use the defined ScalaClass \n\n```c#\nusing CommonTest;\nusing MASES.JCOBridge.C2JBridge;\nusing MASES.LicenseManager.Common;\nusing System;\nusing System.IO;\n\nnamespace ScalaClassUseExample\n{\n    class TestClass : BaseTestClass\n    {\n        public override string GetProjectClassPath()\n        {\n#if !JCOBRIDGE_CORE\n            return @\"..\\..\\JVM\\Scala\\Output\";\n#else\n            return @\"..\\..\\..\\JVM\\Scala\\Output\";\n#endif\n        }\n\n        public override string ClassPath\n        {\n            get\n            {\n                return new ClassPathBuilder(GetProjectClassPath() + @\"\\*\", @\"C:\\Program Files (x86)\\scala\\lib\\*.jar\").Build();\n            }\n        }\n\n        public override void Execute()\n        {\n            int a = 10;\n            int b = 15;\n            var scalaClass = DynJVM.ScalaClass.@new();\n            var result = scalaClass.add(a, b);\n            Console.WriteLine(\"{0} + {1} = {2}\", a, b, result);\n\n            string[] strings = new string[] { \"One\", \"Two\", \"Three\" };\n            var concatString = scalaClass.stringConcat(strings);\n            Console.WriteLine(\"{0} = {1}\", string.Concat(strings), concatString);\n\n            Console.WriteLine(\"Press Enter to exit\");\n            Console.ReadLine();\n        }\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            try\n            {\n                new TestClass().Execute();\n            }\n            catch (Exception e)\n            {\n                Console.WriteLine(e.Message);\n                Console.WriteLine(\"Press any key.\");\n                Console.ReadKey();\n            }\n        }\n    }\n}\n\n```\nIn Scala all the needed libraries shall be explicitly added to the base path.  \n\n## Scala to .NET Example\n\nIn this example we call .NET object from Scala language via JCOBridge.\nBefore call compile and execute batch script Scala [binaries](https://downloads.lightbend.com/scala/2.12.8/scala-2.12.8.msi) shall be installed.\n\n\n```java\nimport java.util.Iterator\nimport org.mases.jcobridge._\n\nobject Main extends App {\n  try\n  {\n    JCOBridge.Initialize();\n  }\n  catch\n  {\n    // catch to avoid problem with Trial mode of JCOBridge\n    case jce: JCException =\u003e System.out.println(jce.getMessage)\n  }\n\n  val bridge = JCOBridge.CreateNew()\n\n  // adds a new reference to WPF \n  bridge.AddReference(\"PresentationFramework\")\n  // get MessageBox type\n  val msgType = bridge.GetType(\"System.Windows.MessageBox\")\n  // invoke static method to show a message box on the screen\n    msgType.Invoke(\"Show\", \"Please press enter to continue\")\n\n  // get .NET type\n  val enumType = bridge.GetType(\"System.Environment\")\n  // invokes static method\n    val genObj = enumType.Invoke(\"GetLogicalDrives\")\n  // retrieve the iterator\n  val iteratorObj = genObj.asInstanceOf[JCObject].iterator\n  // iterate on all object and print the value\n  while (iteratorObj.hasNext) println(iteratorObj.next)\n\n  // invoke static method to show a message box on the screen\n    msgType.Invoke(\"Show\", \"Please press enter\")\n\n  // event callback example\n  val tObj = bridge.NewObject(\"System.Timers.Timer\"); // create the timer object\n  val timerObj = tObj.asInstanceOf[JCObject];\n  // register an event handler when the Timer elaps\n  timerObj.RegisterEventListener(\"Elapsed\", new ScalaJCVoidEventEmit()); \n  // set Interval property\n  timerObj.Set(\"Interval\", 1000); // set properties\n  // enable the Timer\n  timerObj.Set(\"Enabled\", true); // start timer\n\n  // invoke static method to show a message box on the screen\n    msgType.Invoke(\"Show\", \"Please press enter\")\n}\n\nfinal class ScalaJCVoidEventEmit() extends JCVoidEventEmit {\n  override def EventRaised(args: Object*) : Unit =\n  {\n        // scala seems to have a problem to translate var args argument into JVM bytecode. This method is needed to avoid compilation problems\n  }\n  // this method defines exactly the signature expected from the event\n  def EventRaised(sender: Object, arg: Object) : Unit =\n  {\n        println(\"Timer Elapsed\")\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmasesgroup%2Fjcobridge-examples","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmasesgroup%2Fjcobridge-examples","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmasesgroup%2Fjcobridge-examples/lists"}