使用 Windows Shell 的 .NET 5 方式是什么?

What is the .NET 5 way of working with the Windows Shell?

我最近将我的一些软件项目转移到了 .NET 5。我使用 Microsoft WindowsAPICodePack 来与 WindowsShell 一起工作,但这图书馆变老了,似乎不再维护了。此外,它是为 .NET Framework 4.7 或 4.8 编译的,可能与 .NET 5 不兼容。那么 'proper'(最好的,现代的)使用 Windows [=19= 的方式是什么? ] 来自 .NET 5 应用程序。例如,我使用旧的 API 代码包来获取用户的库、获取文件图标等。我注意到名称空间 Windows.Storage 似乎具有部分或全部这些功能,但它似乎更针对 UWP(也许这对于 .NET 5 项目来说并不重要?)。或者我需要查看 WinRT 吗?有什么想法吗?

So what is the 'proper' (as in best, modern) way to work with the Windows Shell from a .NET 5 app

正式地说,我认为没有。也就是说,它是 undefined.

我注意到 C# 和 .NET 确实没有提供使用 COM 的最佳开发人员 UX - 令人遗憾的是,在 2020 年,使用 COM 的最佳 语言仍然是VB6 和编写 COM 的最佳语言是 C++。

虽然记住 WinMD 和 C++/CX 是关于 COM 的现代化,它是 WinRT 和 UWP 的基础 - 所以我预计 most 的旧 shell 功能将通过那里公开,这应该比直接使用 COM 接口更容易使用。我还注意到,许多 UWP 的 API 现在也可用于非沙盒应用程序。

确实有人要求 Microsoft 将该端口包含在现在开源的 WinForms 项目中,but it was declined as being out-of-scope。 (嘘!)

I use the Microsoft WindowsAPICodePack to work with the Windows Shell, but this library is getting old and does not seem to be maintained anymore. Also, it's compiled for .NET Framework 4.7 or 4.8 and might be incompatible with .NET 5.

确实如此。我不相信它会 按原样 工作,但是 WindowsAPICodePack 是 Win32 的 Shell COM 接口的一个非常薄的包装器,因此使用转储程序集应该很简单ILSpy 并针对 .NET Standard 2.0 重新编译它(因此您可以继续在 .NET Core、.NET 5 和 .NET Framework 项目中使用它)。

WinCopies.WindowsAPICodePack.Shell was updated to 2.1.0,带来 .Net Core 3.1 和 .Net 5.0 支持:

所以添加包

<PackageReference Include="WinCopies.WindowsAPICodePack.Shell" Version="2.1.0" />

并将您的应用定位为 net5,并像使用 Microsoft 的原始包一样使用 API。

另一个库可能是 https://github.com/dahall/Vanara,本质上是几乎所有原生 Windows API 的包装器集合,包括 shell API。