【问题标题】:Can't use System.Configuration.Configuration manager in a .NET Standard2.0 library on .NET FX4.6无法在 .NET FX4.6 上的 .NET Standard2.0 库中使用 System.Configuration.Configuration 管理器
【发布时间】:2018-03-03 19:07:39
【问题描述】:

我在 NetStandard2.0 中创建了一个程序集。它使用 System.Configuration.ConfigurationManager 读取 AppSettings。我已经安装了适用于 NetStandard2.0 的 4.4.X 版本的 System.Configuration.ConfigurationManager nuget 包。

当我在控制台应用程序 (.Net Core) 中引用此程序集时,它会正确读取 AppSettings,但是当我在旧的 .NetFramework(4.6.X) 控制台应用程序中引用此程序集时,它无法正常工作并引发异常。

请看下面的代码。

程序集 1:NetStandard 2.0

Nuget:System.Configuration.ConfigurationManager 4.4.0

using System.Configuration;

namespace Bootstrapper.Lib
{
   public class Bootstrapper
   {
     public Bootstrapper()
     {

     }

     public void LoadAppSettings()
     {
         string serachPattern= 
         ConfigurationManager.AppSettings["AssemblySearchPattern"];
     }
  }

}

控制台应用:NetFx 4.6.X

using System;
using Bootstrapper.Lib;
namespace Bootstrapper.Console
{
  class Program
  {
    static void Main(string[] args)
    {
        new Bootstrapper().LoadAppSettings();
    }
  }
}

运行后异常:

'Could not load file or assembly 'System.Configuration.ConfigurationManager, 
 Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one 
 of its dependencies. The system cannot find the file specified.'

它将与使用 .NetCore 开发的控制台应用程序一起使用。

请帮忙!!!

【问题讨论】:

  • Microsoft 刚刚宣布了“适用于 .NET Core 的 Windows 兼容包”。除其他外,它包含System.Configuration.ConfigurationManager(但反过来将您的 .NET 核心应用程序变成“仅限 Windows”)。我不知道它是否已经可用。只需谷歌引号中的术语,看看你能找到什么。
  • 您是否启用了 github.com/dotnet/announcements/issues/31 中所述的自动绑定重定向生成?
  • @MartinUllrich 是的,我今天试过了,但遇到了同样的异常。
  • 解决了!刚刚将 System.Configuration.ConfigurationManager 4.4.0 的 nuget 添加到控制台应用程序

标签: c# .net .net-standard .net-standard-2.0


【解决方案1】:

无法创建引用System.Configuration.ConfigurationManager 包并使用ConfigurationManager 类的.NET Standard 库。一旦库添加了对 .NET Core 特定包的引用,它就不再是可移植的 .NET Standard 库,因为它绑定到特定于框架的包。

.NET Standard 2.0 不包含 System.Configuration.ConfigurationManager API。因此,使用此 API 的唯一方法是针对 .NET Core System.Configuration.ConfigurationManager 包构建一个版本的库,该包可在 .NET Core 上使用,并针对 .NET FX @987654328 构建第二个版本的库@ 程序集,可用于 .NET FX

【讨论】:

【解决方案2】:

正如@kiran 在评论中提到的,你可以通过运行来解决这个问题:

Install-Package System.Configuration.ConfigurationManager

在 NuGet 包管理器中

【讨论】:

  • @Xander 就我而言,我将它安装在 NetFramework(4.6.X) 控制台应用程序中。
  • 你可以从这里nuget.org/packages/System.Configuration.ConfigurationManager/… 安装这个 nugget 包管理器,关于如何安装它的所有说明都在那里。到目前为止,您还需要 NETFramework 4.6.1 及更高版本。
  • 知道为什么会这样吗?我了解解决方案,但不了解哪个组件声明了对该程序集的依赖
【解决方案3】:

遇到同样的问题,在 FX4.6 项目中安装相同的 System.Configuration.ConfigurationManager 包后解决了这个问题。

【讨论】:

    【解决方案4】:

    替代解决方案如下:

    1.复制 .Net 标准依赖项

    按照here 的描述,将以下行添加到您的 .Net 标准 csproj 文件(程序集 1)中。

    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

    然后将Assembly 1的其他依赖项rebuild Console App和System.Configuration.ConfigurationManager.dll复制到Console App的bin目录下。

    在我的例子中,它复制了下面的 dll 列表

    有趣的是,当我使用另一个解决方案并直接将 System.Configuration.ConfigurationManager NuGet 包安装到 FX4.6 控制台应用程序时,结果我有另一组依赖项:

    请注意System.Configuration.ConfigurationManager.dll 以及其他 dll 的大小不同。据我了解,在第一种情况下它是从%userprofile%\.nuget\packages\system.configuration.configurationmanager\5.0.0\lib\netstandard2.0 复制的,但在第二种情况下是从%userprofile%\.nuget\packages\system.configuration.configurationmanager\5.0.0\lib\net461 复制的

    无论如何,两种解决方案都有效,所以我不确定哪个更正确。

    2。使用多目标

    在您的 .Net 标准 csproj 文件(程序集 1)中,将第二个目标设置为 net461,如 here 所述行

    <TargetFrameworks>netstandard2.0;net461</TargetFrameworks>

    然后在构建时将生成两个版本的库 - 在\bin\Release\net461\bin\Release\netstandard2.0。如果您的控制台应用程序以 .Net Framework 4.6.1 或更高版本为目标,它将自动将正确版本的 Assembly 1 作为依赖项(来自 \net461 的那个)。

    这种方法的好处是 net461 版本的库不需要依赖于 System.Configuration.ConfigurationManager.dll 并且可以在没有它的情况下分发。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      相关资源
      最近更新 更多