Tag: .net 4.6

为什么.NET 4.6特定代码在针对框架的旧版本时编译?

我有一个针对旧版.NET Framework(.NET 4.5.2)的项目。 我安装了Visual Studio 2015(因此我的机器上安装了.NET 4.6)。 我注意到如果我使用.NET 4.6 / C#6中发布的C#语言function,它仍会编译。 如果我的项目的目标框架是<.NET 4.6,那么这不应该编译: public string MyExpressionBodyProperty => “1”; //auto properties are new in C# 6 public string MyAutoProperty { get; } = “1”; private static void MethodThatUsesNameOf(string filename) { if (filename == null) { //nameof was released in C# 6 throw new ArgumentException(“The file does […]

混合WPF和winforms项目DPI意识

我有一个使用winforms和WPF的C#程序,我很难让它在高DPI环境中工作。 目前,如果我从解决方案中删除所有WPF项目并运行它,它将会很好地扩展,但是只要我重新添加任何wpf(function必需),扩展就会失败并且UI变得无法使用。 这似乎与以前的SO问题完全相同: 混合WinForms和WPF应用程序中的.Net 3.5中的DPI缩放以及使用DPI正确扩展WinForms的问题 我按照这些问题的建议,尝试添加清单文件和提供的dpi识别代码。 我还将项目升级到.net framework 4.6.1(从4.0开始)并包含了app.config设置: 这确实影响了程序的主shell(因此,不是在一个小窗口中加载所有控件被压缩,主程序窗口打开最大化并显示正常)但是,当我从主窗口输入任何winforms子窗体或插件时,缩放失败。 当我输入任何WPF子表单或插件,或返回到主屏幕时,这些正确呈现。 只有winformsfunction无法正确扩展。 有没有人对如何让混合winforms / WPF项目在高DPI中正确扩展有任何想法? 提前致谢

在.VS 2015 NET 4.5中使用字符串插值和名称

我在我的代码中使用了诸如$”hello {person}”和nameof(arg1) ,但在检查项目属性时,我的目标是.NET 4.5。 这个可以吗? 我认为这些东西是在4.6中引入的。 该项目在我的机器上构建并运行正常 – 但我担心在部署它时会出现问题。

在C#(.NET 4.6)中关闭保持活动的FTP或FTPS连接的最佳方法?

在C#(.NET 4.6)中,我使用保持活动的FTPS连接来下载循环中的几个文件,如下所示: foreach (string filename in filenames) { string requestUriString = GetFtpUriString(myDir) + “/” + filename; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(requestUriString); request.Method = WebRequestMethods.Ftp.DownloadFile; request.Credentials = new NetworkCredential(myFtpsUsername, myFtpsPassword); request.EnableSsl = true; request.ConnectionGroupName = myConnectionGroupName; request.KeepAlive = true; … do something … } 循环完成后,我想关闭连接。 我找不到直接的方法来实现这一目标。 我想出的是以下解决方法,它会向FTP服务器发出另一个低占用空间的请求,这次KeepAlive标志设置为false : FtpWebRequest request = (FtpWebRequest)WebRequest.Create(GetFtpUriString(myDir)); request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory; request.Credentials = […]

使用VS2015 Update 1编译时表达式破坏代码

在我的机器上安装Visual Studio 2015 Update 1之后,我看到我的一些unit testing失败了。 在做了一些调查后,我能够将问题减少到这行代码: Expression<Func> expression = t => tX == 0 && tY == 0 && t.GameObjectType == GameObjectType.WindMill; 将鼠标hover在表达式变量上时,Visual Studio版本中的结果会有所不同: VS 2015: VS 2015 Update 1: 正在对枚举进行比较的逻辑(ServiceStack.OrmLite代码中的某个地方)现在采取了不同的行为,最终导致枚举不被识别为枚举,从而导致unit testing失败。 我能够使用以下代码重现该问题: class Program { static void Main(string[] args) { var gameObjects = new List { new GameObject { X = 0, Y […]

TaskContinuationOptions.RunContinuations异步和Stack Dives

在这篇博客文章中 ,Stephan Toub描述了一个将包含在.NET 4.6中的新function,它为TaskCreationOptions和TaskContinuationOptions枚举增加了另一个名为RunContinuationsAsynchronously 。 他解释说: “我谈到了在TaskCompletionSource上调用{Try} Set *方法的分支,从TaskCompletionSource的Task的任何同步延续都可以作为调用的一部分同步运行。如果我们在这里调用SetResult同时持有锁,那么同步延续关闭该任务将在持有锁的同时运行,这可能会导致非常真实的问题。因此,在持有锁时我们抓住TaskCompletionSource来完成,但是我们还没有完成它,延迟这样做直到锁定已被释放“ 并给出以下示例来演示: private SemaphoreSlim _gate = new SemaphoreSlim(1, 1); private async Task WorkAsync() { await _gate.WaitAsync().ConfigureAwait(false); try { // work here } finally { _gate.Release(); } } 现在假设您有很多对WorkAsync的调用: await Task.WhenAll(from i in Enumerable.Range(0, 10000) select WorkAsync()); 我们刚刚创建了10,000个对WorkAsync的调用,这些调用将在信号量上进行适当的序列化。 其中一个任务将进入关键区域,其他任务将在WaitAsync调用上排队,SemaphoreSlim内部有效地将任务调用完成,当有人调用Release时。 如果Release同步完成了Task,那么当第一个任务调用Release时,它将同步开始执行第二个任务,当它调用Release时,它将同步开始执行第三个任务,依此类推。 如果上面代码的“// work here”部分没有包含任何等待产生的东西,那么我们可能会在这里堆叠潜水并最终可能导致堆栈爆炸。 我很难掌握他谈论同步执行延续的部分。 题 怎么可能导致堆栈潜水? 更重要的是,为了解决这个问题, RunContinuationsAsynchronously会RunContinuationsAsynchronously地做些什么?

Visual Studio 2015 – Web项目中缺少共享项目参考选项卡

我从MSDN订阅升级到Visual Studio 2015,因为我很高兴阅读有关共享项目的内容…当我们想要做的只是重用代码时,不再需要在我们的依赖项中管理21382个nuget包。 所以我构建了一个测试共享项目,其中包含一些代码。 然后我在.Net 4.6上添加一个新的空Web应用程序到项目中。 现在我希望转到引用并在引用窗口中看到“共享项目”选项卡,但我没有看到。 现在我可以将类库添加到同一个解决方案中,然后我会看到选项卡并添加共享引用。 但是,我无法将共享项目添加到我的Web应用程序。 我非常希望我可以使用这个概念与多个MVC项目共享视图。 我在这里遗漏了什么,或者是与Web项目不兼容的共享项目? 我看到的唯一方法是为我构建的每个Web应用程序提供两个项目。 代码为1,内容为1。 例如 XYZ.SomeWebSite.Code (Class Library Project Type) -> references Shared Project XYZ.SomeWebSite (Web Project Type) 然而,走这条路线,我无法将视图,文本文件,CSS文件,javascript文件等推送到Web应用程序中。

带伪造的unit testing中的Visual Studio 2015 InvalidProgramException

我正在使用Visual Studio 2015 Enterprise RTM为使用Unity Container的项目编写unit testing。 我发现为Unity添加一个fakes程序集的简单行为,甚至实际上不使用伪造,足以产生这个exception: System.InvalidProgramException:公共语言运行时检测到无效程序。 请考虑以下步骤来重现: 使用Visual Studio 2015 Enterprise RTM创建面向.NET 4.6的unit testing项目 添加NuGet包“Unity”版本3.5.1404.0 添加NuGet包“CommonServiceLocator”1.2.0版 像这样写一个unit testing: [TestClass] public class UnitTest1 : IDisposable { [TestMethod] public void TestMethod1() { new ResolvedArrayParameter(new IDisposable[] {this}); } void IDisposable.Dispose() { } } validation测试通过 右键单击Microsoft.Practices.Unity参考并选择“Add Fakes Assembly” 重新运行测试 观察以下显着的测试失败: 测试名称:TestMethod1 测试FullName:UnitTestProject11.UnitTest1.TestMethod1 测试源:c:\ temp \ UnitTestProject11 […]

如何禁用整个类的特定代码分析警告

我试图在整个类中禁用代码分析规则,但不是整个项目,只是一个类。 在下面的示例中,构建生成CA1822警告,因为它认为unit testing方法应该是静态的。 修复是将以下属性添加到每个unit testing方法: [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Performance”, “CA1822:MarkMembersAsStatic”)] 然而,这很繁琐,并且在一个有很多unit testing的课程中变得杂乱无章。 我试过了: 将属性移动到类 包装所有方法 #pragma warning disable CA1822 #pragma warning restore CA1822 这两种方法都没有奏效。 public class TestClass { public TestClass() { // some setup here } [Fact] public void My_Unit_Test1() { // the ‘this’ parameter is never used, causes CA warning 1822 } [Fact] public void My_Unit_Test2() { […]

始终在库中的异步方法中使用“async”和“await”关键字?

简介 :在库方法中,何时应该使用async和await关键字而不是直接返回Task ? 我相信我的问题与此问题有关。 但是,这个问题是关于.NET 4.0和TPL,而我正在使用带有async和await关键字的.NET 4.6。 所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在。 说明:我正在为外部WCF服务编写一个简单的包装器,并且包装器会进行多个SendAsync调用。 现在我认为每个包装器方法应该直接返回一个Task而不需要等待。 我的理解是应该在应用程序层上使用async / await ,而不是在库中。 因此,例如,我认为我应该为每个包装器方法采用的方法: private Task GetSignDataAsync(SigningRequestType request) { return _service.SendAsync(request); } 但是在互联网上,我找到了几个使用这种方法的post : private async Task GetSignDataAsync(SigningRequestType request) { return await _service.SendAsync(request).ConfigureAwait(false); } 这是我在technet上找到的另一个例子: async Task PutTaskDelay() { await Task.Delay(5000); } private async void btnTaskDelay_Click(object sender, EventArgs e) { await PutTaskDelay(); MessageBox.Show(“I am […]