netstandard1.x和winforms / wpf / windows - 无法加载文件或程序集System.Runtime,Version = 4.1.0.0

时间:2016-08-24 20:19:52

标签: c# .net winforms asp.net-core .net-standard-1.5

我已经设置了一个可重用的基类库,我想用于Web,桌面和移动。它具有基本的功能,例如字符串,日期时间操作等。因为我讨厌两次编写代码。

VS2015告诉我最好使用新的“.NET标准”平台,所以我这样做了,它给了我这个项目.json

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },
  "frameworks": {
    "netstandard1.5": {}
  }
}

使用xunit运行单元测试很顺利。直到我决定在面向net462的WinForms应用程序中使用它(参考)(是的,有些人仍然有想要WinForms的客户端)。应用程序编译了a-ok,没有任何警告或错误。但是当我运行应用程序时,我收到了这个错误:

An exception of type 'System.IO.FileNotFoundException' occurred in DelegateIT.Core.Examples.Wizard.WinFormsClient.exe but was not handled in user code

Additional information: Could not load file or assembly 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

我尝试了不同的选择,没有成功:

  • "net462": {}添加到框架部分
  • 尝试在"net462": { "bin": { "assembly": "external\\TheLibraryName.dll", "pdb": "external\\TheLibraryName.pdb" } }中将“bin”构建目标添加到框架部分 - 但是没有输出该平台的自定义DLL。

我应该创建一个新项目,一个“.Net 4.6.2”类库并将这些文件作为链接导入吗?虽然我认为这个全新的系统会浪费每个目标框架的项目文件时间:(。

修改/附录 我在Wpf& WinForms客户端:

foreach (var line in csvLines) {
  var splittedLine = line.Split(';');
  splittedLines.Add(splittedLine.Select(s => CleanString(s)).ToList());
}

当我遗漏了CleanString这样的方法时

foreach (var line in csvLines) {
  var splittedLine = line.Split(';');
  splittedLines.Add(splittedLine.Select(s => /*CleanString(*/s/*)*/).ToList());
}

然后错误就消失了,Wpf客户端和WinForms客户端运行正常。似乎System.Linq或至少System.Linq.Expressions导致此错误。但深入挖掘我确保编辑CleanString方法,并删除了我的扩展方法“RemoveMultipleWhiteSpaces”。

作为参考,这是CleanString方法和引用扩展方法

    private string CleanString(string @string) {
      return @string
        .Trim()
        .RemoveMultipleWhitespaces();
    }

    public static string RemoveMultipleWhitespaces(this string @string) {
      if (@string == null) {
        return @string;
      }

      var cleanedString = Regex.Replace(@string, @"(\s)\s+", "$1");

     return cleanedString.Trim();
  }

因此,总而言之,当我在CleanString中使用以下代码时,它编译并工作。所以我不确定,这个System.Linq还是其他不受支持..?

private string CleanString(string @string) {
            return @string
                .Trim()
                /*.RemoveMultipleWhitespaces()*/;
        }

修改/ ADDENDEUM2:

在project.json中尝试过,但没有用。还尝试添加“System.Runtime”:“4.1.0”作为依赖,而不是运气。

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1",
    "System.Linq": "4.1.0",
    "System.Linq.Expressions": "4.1.0",
    "System.Text.RegularExpressions": "4.1.0"
  },
  "frameworks": {
    "net462": {},
    "netstandard1.5": {}
  }
}

2 个答案:

答案 0 :(得分:1)

我遇到同样的问题(完全相同)。
 我刚刚在本地nuget包中找到了所需的dll(在本例中为C:\Users\Soren\.nuget\packages\System.Reflection\4.1.0\lib\net462\System.Reflection.dll),并将其复制到我的项目的输出中,异常消失了。
但这不是解决方案,并且暂时解决了这个问题。

答案 1 :(得分:1)

您不必手动复制.NET标准库的依赖项。

微软最终承认这是一个问题,而且will fix预计会在NuGet 4.0.1版本中出现,这是VS 2017发布后对NuGet 4的第一次更新。

现在最简洁的解决方法是将<RestoreProjectStyle>PackageReference</RestoreProjectStyle>添加到旧项目中。但是according to Rob Relyea MS会在RTM之后忽略此属性,因此另一种解决方法是<PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>

另一种解决方法是将.NET标准库打包到NuGet包中,就像在that answer中一样,但这不是最简单的方法。