【问题标题】:Can't call/load .NET Core assembly but .NET Standard works fine using Add-Type in PowerShell无法调用/加载 .NET Core 程序集,但 .NET Standard 在 PowerShell 中使用 Add-Type 可以正常工作
【发布时间】:2019-02-22 21:40:21
【问题描述】:

在尝试为 PowerShell 创建 .NET Core 类库时,我发现 .NET Standard 和 .NET Core 之间存在一些奇怪的差异。

按照this 的指导,我创建了一个简单的 .NET Standard 2.0 类库,并且能够使用 Add-Type -Path [path] 在 PowerShell 5.1 和 PowerShell 6.0.1 中成功加载它。

namespace Animal
{
    public class Dog
    {
        public string Bark()
        {
            return "Woof!";
        }
    }
}

我可以调用 .Bark() 方法并在 PowerShell 5.1 和 PowerShell Core 6.0.1 中查看输出。

当我使用 .NET Core 2.2 模板构建相同的类时,我无法在任一 PowerShell 实例中使用它。代码几乎相同:

namespace AnimalCore
{
    public class Dog
    {
        public string Bark()
        {
            return "Woof!";
        }
    }
}

PowerShell 5.1:

Add-Type : 无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

PowerShell 核心 6.0.1

找不到类型 [AnimalCore.Dog]

我可以愉快地继续使用 .NET Standard 模板来构建我的程序集,但我想知道这里有什么区别以及如何编译这个类库以在 .NET Core 上使用?

【问题讨论】:

  • LoaderExceptions 说明了什么?您应该可以使用$Error[0].Exception.LoaderExceptions 进行检查

标签: c# powershell


【解决方案1】:

倒序:

如何编译这个类库以在 .NET Core 上使用?

为了让 PowerShell Core 使用您的库,您现在必须以 .NET Core 版本 2.1 为目标 - 尚不支持 2.2(尽管我的理解是下一个版本,PowerShell Core 6.2,将看到项目迁移到 .NET Core 2.2)。


我可以愉快地继续使用 .NET Standard 模板来构建我的程序集,但我想知道这里有什么区别

您可能知道,.NET Framework 和 .NET Core 之间没有完全的功能对等 - Windows 附带的一些基类库在 .NET Core 中自然不可用,并且需要一些跨平台支持在 .NET Core 中导致某些 API 的行为与在 .NET Framework 中不同。

这种可移植性差距的解决方案称为 .NET Standard - 它定义了在 Framework 和 Core 之间完美重叠的大量 API!

因此,当您以 netstandard2.0 而不是 netcoreapp2.2netcoreapp2.1 为目标时,这是一种确保 .NET Framework .NET Core 运行时都可以引用和使用您的库的方法 - 这这正是您发现您的代码在 PowerShell 5.1 和 6.0.1 中都能完美运行的原因,只要您以 .NET Standard 为目标

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多