Run WinForms Apps for Windows CE on Linux
Cross-Platform Compatibility for Legacy Applications
Are you looking for a way to run Windows Forms applications originally built for WindowsCE on a Linux environment? Mono provides a powerful and flexible solution to bridge the gap, enabling you to execute .NET applications seamlessly.
F&S also provides libraries for interface interaction, so you can even call I²C, SPI and UART from your WinForms app running on Linux!
Why Use Mono for WindowsCE Apps?
- Cross-Platform Support – Run .NET WinForms applications on Linux without requiring a Windows runtime.
- Extend the Lifecycle of Legacy Software – Keep your existing applications operational even as Windows CE support declines.
- Cost-Effective Migration – Avoid expensive rewrites by leveraging Mono’s compatibility with the .NET framework.
- Open-Source & Customizable – Adapt and optimize your solution for embedded and industrial environments.
Why not use Microsoft .NET for Linux?
Microsoft offers .NET for Linux. Problem with this version is the missing support for WinForms or WPF. So if your application simply uses .NET without graphics, .NET for Microsoft is our recommendation.
How It Works
Mono is an open-source implementation of the .NET Framework that supports running Windows Forms applications outside of the Windows ecosystem. With the right configuration, it can execute applications built for WindowsCE, offering an alternative runtime on Linux-based systems. The additional libraries from F&S ensure that even the calls to hardware interfaces can stay the same in Linux as in WindowsCE.
![]() |
![]() |
Get Started
Your application should already implement the APIs provided by F&S if you need to interact with the hardware interfaces I²C and SPI (NativeI2C.dll and NativeSPI-V1.dll). We also provide them for Linux systems, so your software can interact with these interfaces without extensive changes in the code base. What needs to be changed in code however, are the device names. For example I2C2: must be called with /dev/i2c-2 in Linux and SPI1: could be /dev/spidev0.0, but this depends on your hardware and pin connections.
Next, Mono must be installed on your Linux system. For the F&S Yocto releases, this can be achieved by adding the meta-mono layer (https://git.yoctoproject.org/meta-mono/about/) to your build. If you have your new Linux system installed on your board, you still need to prepare Mono by adding a library provided by F&S (called libfs_dotnet_io_api.so.0.1), which replaces the WinCE-library coredll.dll. [HF1] This library “translates” your interface calls from Windows to Linux commands.
Copy your Windows-executable to the board, alongside the Linux-specific APIs NativeI2C.dll and NativeSPI-V1.dll. Then run your application:
mono [path/to/your/app.exe]
You can find the code for the APIs and the library on GitHub:
https://github.com/FSEmbedded/NativeI2C_Linux
https://github.com/FSEmbedded/NativeSPI-V1_Linux
https://github.com/FSEmbedded/dotnet_linux_IO_API
Following are some screenshots of a demo application by F&S running on two different efusA9X. The Code is also available on GitHub: https://github.com/FSEmbedded/WinForms_On_Linux_InterfaceDemo
On one of these is Windows CE 2013 installed, the other one uses the latest Yocto-release from F&S (fsimx6sx-Y2024.12) with additional Mono installed. This software can interact with I²C, SPI and UART on both Operating Systems without any changes in the code.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |