【问题标题】:What is the .NET 5 way of working with the Windows Shell?.NET 5 使用 Windows Shell 的方式是什么?
【发布时间】:2021-03-24 01:51:09
【问题描述】:

我最近将我的一些软件项目迁移到 .NET 5。我使用 Microsoft WindowsAPICodePack 与 Windows Shell 一起工作,但这个库已经过时并且似乎不再维护。此外,它是为 .NET Framework 4.7 或 4.8 编译的,可能与 .NET 5 不兼容。那么从 .NET 5 应用程序使用 Windows Shell 的“正确”(最好的、现代的)方式是什么。例如,我使用旧的 API 代码包来获取用户的库、获取文件图标等。我注意到命名空间 Windows.Storage 似乎具有部分或全部这些功能,但它似乎更针对UWP(也许这对于 .NET 5 项目来说并不重要?)。还是我需要研究 WinRT?有什么想法吗?

【问题讨论】:

    标签: c# .net-5 windows-api-code-pack


    【解决方案1】:

    WinCopies.WindowsAPICodePack.Shell 更新为2.1.0,带来.Net Core 3.1 和.Net 5.0 支持:

    所以添加包

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

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

    【讨论】:

    • 虽然这看起来很有希望,但它缺少我实际使用的一个东西:ShellObject。我不确定为什么不包含它,或者它是否移动了命名空间,但我找不到它。
    • 好吧,也许我应该使用 GitHub 的源代码,然后我尝试了 NuGet 包。
    • 太好了,我找到了正确的 NuGet 包并且它可以工作。
    • 我不认为缺少一个,我选错了。
    【解决方案2】:

    那么从 .NET 5 应用程序中使用 Windows Shell 的“正确”(最好的、现代的)方式是什么

    官方上,我认为没有。也就是说,它是未定义的

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

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

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

    我使用 Microsoft WindowsAPICodePack 与 Windows Shell 一起工作,但是这个库已经过时并且似乎不再维护了。此外,它是为 .NET Framework 4.7 或 4.8 编译的,可能与 .NET 5 不兼容。

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

    【讨论】:

    • 很好的答案!我最终尝试重新编译 WindowsAPICodePack(源代码是公开的),但遇到了太多问题。然后我开始从中挑选我使用的那些代码文件并将其集成到我的项目中,这很有效。所以我解决了 .NET 版本问题,但没有解决维护问题 - 我现在必须自己维护它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多