无法调用/加载.NET Core程序集,但.NET Standard在PowerShell中使用Add-Type可以正常工作

Jas*_*SFT 6 c# powershell

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

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

namespace Animal
{
    public class Dog
    {
        public string Bark()
        {
            return "Woof!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

namespace AnimalCore
{
    public class Dog
    {
        public string Bark()
        {
            return "Woof!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PowerShell 5.1:

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

PowerShell Core 6.0.1

无法找到类型[AnimalCore.Dog]

我很高兴继续使用.NET标准模板来构建我的程序集但是我想知道这里有什么区别以及如何编译这个类库以便在.NET Core上使用?

Mat*_*sen 4

按相反顺序:

如何编译此类库以在 .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 中所需的一些跨平台支持核心导致某些 API 的行为与 .NET Framework 中不同。

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

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