WinFormsComInterop
ComWrappers required to run NativeAOT and WinForms
Install / Use
/learn @kant2002/WinFormsComInteropREADME
ComWrappers required to run NativeAOT and WinForms
This repository has ComWrappers implementation for WinForms. In additional to that, it allow use WinForms and NativeAOT and R2R with trimming together.
Getting started
Just add WinFormsComInterop to your project.
dotnet add package WinFormsComInterop
Then to your Program.cs add following line
ComWrappers.RegisterForMarshalling(WinFormsComInterop.WinFormsComWrappers.Instance);
And modify project file to enable NativeAOT
<PublishAot>true</PublishAot>
<_SuppressWinFormsTrimError>true</_SuppressWinFormsTrimError>
If you application will works with this ComWrappers implementation, then most likely it would work with NativeAOT.
If you are using WebView2 using Microsoft.Web.WebView2.Core package, then use
ComWrappers.RegisterForMarshalling(WinFormsComInterop.WebView2.WebView2ComWrapper.Instance);
Note, that it does not working for new WebView2 as of .NET 8, please file and issue if you need it, I'll prioritize.
Also
- Add
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.1462.37" />as depedency. This library would work only starting from this version of WebView2 package. - Add RD.xml file from https://github.com/kant2002/RdXmlLibrary/blob/main/Microsoft.AspNetCore.Components.Web.rd.xml to project
- Add
<RdXmlFile Include="Microsoft.AspNetCore.Components.Web.rd.xml" />to project file - Make sure that RootComponets are added to you app-specific rd.xml
<?xml version="1.0" encoding="utf-8" ?>
<Directives>
<Application>
<Assembly Name="YourAppAssembly" Dynamic="Required All">
<Type Name="YourAppAssembly.YourRootComponent" Dynamic="Required All" />
</Assembly>
</Application>
</Directives>
Testing technology
Test that normal CoreCLR works
dotnet run --project samples\SampleWindowsForms\SampleWindowsForms.csproj
dotnet run --project experiments\WpfTestBed\WpfTestBed.csproj
dotnet run --project experiments\WinUITestBed\WinUITestBed\WinUITestBed.csproj
dotnet run --project experiments\WinUIUWP\WinUIUWP.csproj
NativeAOT
Test that NativeAOT works. Run commands in x64 developer tools.
WinForms
dotnet publish -r win-x64 samples\SampleWindowsForms\SampleWindowsForms.csproj
"samples\SampleWindowsForms\bin\x64\Debug\net6.0-windows\win-x64\publish\SampleWindowsForms.exe"
Below are experimental projects. They are need additional work.
WPF
dotnet publish -r win-x64 experiments\WpfTestBed\WpfTestBed.csproj -p:GenerateWPF=true
blocked by https://github.com/kant2002/WinFormsComInterop/issues/30
WinUI
dotnet publish -r win10-x64 experiments\WinUITestBed\WinUITestBed\WinUITestBed.csproj
Classic UWP project
dotnet publish -r win-x64 experiments\WinUIUWP\WinUIUWP.csproj
does not work due to this error
experiments\WinUIUWP\WinUIUWP.csproj : error MSB4057: The target "Restore" does not exist in the project.
For brave souls
Mostly notes for me, but maybe somebody would like to hack.
Build NativeAOT.
Modify nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<!--Locally built version of NativeAOT -->
<add key="ILC" value="c:\runtimelab\artifacts\packages\Debug\Shipping\" />
<!--To use daily builds of runtime -->
<add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
</packageSources>
</configuration>
Restore packages to local folder to not pollute global Nuget cache. You will build NativAOT a lot.
dotnet restore -r win-x64 --packages packages
Then publish applications using regular workflow described above.
Additional reading
Design of future stubs in Runtime
- https://github.com/dotnet/runtimelab/blob/feature/DllImportGenerator/designs/Pipeline.md#stub-code-generation
Related Skills
node-connect
349.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
349.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
349.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
