带有DescriptionAttribute的.NET标准可移植库错误

时间:2017-08-04 17:35:59

标签: c# attributes .net-core compatibility .net-standard

我创建了一个.NET Standard库,其中包含将在.NET Framework个应用和.NET Core个应用之间共享的模型。

我有enum使用DescriptionAttribute。这是.NET Standard 1.5库中的枚举:

using System.ComponentModel;
public enum Foo
{
    [Description("Description A")]
    A,
    [Description("Description B")]
    B
}

为了能够使用DescriptionAttribute,我添加了System.ComponentModel.Primitives形成NuGet包。

现在在我的.NET Framework应用程序中,我想检索枚举的描述。

获取enum说明的实现在.NET Core.NET Framework之间有所不同。因此,在我的.NET Framework 4.6.2应用中,我有一个扩展名GetDescription,可以解析enum的描述属性并将其返回:

public static string GetDescription(this Enum value)
{
    Type type = value.GetType();
    string name = Enum.GetName(type, value);
    if (name != null)
    {
        FieldInfo field = type.GetField(name);
        if (field != null)
        {
            DescriptionAttribute attr =
                   Attribute.GetCustomAttribute(field,
                     typeof(DescriptionAttribute)) as DescriptionAttribute;
            if (attr != null)
            {
                return attr.Description;
            }
        }
    }
    return null;
}

我收到了这个错误:

  

System.IO.FileNotFoundException:'无法加载文件或程序集'System.ComponentModel.Primitives,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。'

enter image description here

我尝试添加System.ComponentModel.Primitives,但仍然有错误。

修改

这是我项目的结构:

enter image description here

1 个答案:

答案 0 :(得分:2)

要获取加载.NET Standard< = 1.6库所需的完整程序集,您应该安装NETStandard.Library NuGet程序包以及库引用的任何其他程序包(如果使用packages.config基于.NET Framework项目。

在某些情况下,可以通过告诉msbuild在构建期间更新构建程序集的.config文件来修复类似的错误,以通过在csproj文件中添加以下代码段来包含绑定重定向。当库引用.NET Standard项目并由托管应用程序加载时,通常需要这样做。 (例如经典单元测试项目):

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

但是,在您的情况下(.NET Framework控制台应用程序引用.NET标准库)如果您安装所有需要的NuGet包,则不需要这样做。您的app.config文件应自动包含必要的重定向。

请注意,在VS 2017 15.3中,这将会发生变化,您不再需要引用NuGet包来将必要的兼容性库添加到构建输出中。