我已经设置了一个可重用的基类库,我想用于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": {}
}
}
答案 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中一样,但这不是最简单的方法。