![]() |
VOOZH | about |
dotnet add package Shmuelie.WinRTServer --version 2.2.1
NuGet\Install-Package Shmuelie.WinRTServer -Version 2.2.1
<PackageReference Include="Shmuelie.WinRTServer" Version="2.2.1" />
<PackageVersion Include="Shmuelie.WinRTServer" Version="2.2.1" />Directory.Packages.props
<PackageReference Include="Shmuelie.WinRTServer" />Project file
paket add Shmuelie.WinRTServer --version 2.2.1
#r "nuget: Shmuelie.WinRTServer, 2.2.1"
#:package Shmuelie.WinRTServer@2.2.1
#addin nuget:?package=Shmuelie.WinRTServer&version=2.2.1Install as a Cake Addin
#tool nuget:?package=Shmuelie.WinRTServer&version=2.2.1Install as a Cake Tool
π .NET
π NuGet
π NuGet
The Component Object Model (COM) API that underlines .NET and the Windows Runtime supports the concept of Out Of Process (OOP) Servers. This allows for using objects that are in a different process (or even a different machine) as though they were in the local process. This library adds APIs to make the process of creating the "server" in .NET much easier.
Note: COM and Windows Runtime are Windows only.
Because this uses COM/WinRT for the communication any language that can use COM can use this library. As an example of this, the sample includes a simple C++ console application that talks to the .NET/C# server.
Most RPC/ICP systems are just sending messages between the two processes. At most they can serialize an object graph. COM allows for more complicated objects, where the returned types can have methods, events, and properties. If you could do it with a local object, you can do it with a remote object. The samples include using most of these abilities, including having the remote process load a file as a stream and having the local process use the stream without having to send the whole file across.
Many of the types you are used to using are supported out of the box like collection types, map types, streams, etc. This allows you to not have to worry about how the IPC works.
COM provides various ways to secure usage and creation of objects. For more details, see Security in COM.
Currently to create an Out-of-Process server requires the C++/WinRT tooling (though no actual C++ code) and a "contract" project. These two limitations will be removed in a future version of the library.
The contract project is a C# project that contains the interfaces of the remote objects. Output is a WinMD that is referenced by the other projects. The interfaces have some rules:
The interface must have a GUID assigned using the
Windows.Foundation.Metadata.GuidAttribute attribute, not the
System.Runtime.InteropServices.GuidAttribute attribute.
Asynchronous methods must use the WinRT types (IAsyncAction,
IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult>,
IAsyncOperationWithProgress<TResult, TProgress>) instead of Task and
Task<T>.
Event delegates must be either TypedEventHandler<TSender, TResult> or
EventHandler<TResult> instead of EventHandler and EventHandler<T>.
Types in method parameters, type parameters, and return types must be:
Methods, properties, and events are all supported.
The metadata project is a C++/WinRT project that uses MIDL 3.0 to create proxy types in a WinMD that can be referenced by the client of the OOP Server. No actual C++ code is needed, only the IDL.
The IDL is very simple, only needing runtimeclasses that implement the
interface from the contract project. Unlike in C#, in MIDL 3.0 the type
automatically has the members from the interface so they do not need to be
listed again. Importantly the runtimeclass must have an empty constructor,
otherwise the proxy type cannot be created.
βImportant: Because of the mix of SDK Style and C++/WinRT,
nuget restoreis needed to restore for C++/WinRT. In addition<RestoreProjectStyle>Packages.config</RestoreProjectStyle>is needed in the C++ project file.
The server project is the only project that references Shmuelie.WinRTServer.
It will contain implementations of the interfaces from the contract and when run
should register them with an instance of COMServer for COM activation and
WinRtServer for WinRT activation. The implementations must have a GUID using
the System.Runtime.InteropServices.GuidAttribute attribute.
Because the interfaces must use the WinRT asynchronous types instead of the .NET
ones, the implementation will likely need to use AsyncInfo to help adapt
between the two systems.
A client can be both full trust applications (Win32, WPF, WinForms, etc) or a UWP app.
A UWP client cannot use WinRT activation and must use COM style activation. The UWP sample app shows how to do this. To understand the details behind it, see this blog post.
A full trust client can use WinRT activation, which allows you to create the
remote instances simply by new SomeType(), like you would for any other type.
The sample WPF application shows this in action (using with WinForms would be
similar).
To help understand usage and show what can be done samples can be found under the tests folder. The sample has:
Note: If Visual Studio fails to build the Metadata project restarting Visual Studio should fix the problem.
If you are having issues, check on these things:
Windows.Foundation.Metadata.GuidAttribute attribute, not the
System.Runtime.InteropServices.GuidAttribute attribute.System.Runtime.InteropServices.GuidAttribute attribute, not the
Windows.Foundation.Metadata.GuidAttribute attribute.| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0-windows10.0.22000 net8.0-windows10.0.22000 is compatible. net9.0-windows net9.0-windows was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 1 NuGet packages that depend on Shmuelie.WinRTServer:
| Package | Downloads |
|---|---|
|
JPSoftworks.CommandPalette.Extensions.Toolkit
Package Description |
Showing the top 6 popular GitHub repositories that depend on Shmuelie.WinRTServer:
| Repository | Stars |
|---|---|
|
openclaw/openclaw-windows-node
Windows companion suite for OpenClaw - System Tray app, Shared library, Node, and PowerToys Command Palette extension
|
|
|
lin-ycv/EverythingCommandPalette
Everything search extension for Command Palette
|
|
|
N0I0C0K/PowerTranslator
δΈδΈͺ PowerToys Run ηηΏ»θ―ζδ»Ά/a translate plugin for PowerToys Run
|
|
|
Daydreamer-riri/CmdPal-WebSearchShortcut
This is a simple CmdPal Extension for quickly select a specific search engine to perform searches.
|
|
|
hlaueriksson/GEmojiSharp
:octocat: GitHub Emoji for C#, dotnet and beyond
|
|
|
zadjii/CmdPalExtensions
A collection of extensions for the Windows Command Palette
|
Partial fix for lifetime management