我在VS2015中发现了一个奇怪的行为.以下是详细信息:
我有一个引用3.5程序集的.Net 4.6项目.这个程序集在其中一个接口中定义了我能够使用Resharper反编译器检查的以下方法.
void WriteString([MarshalAs(UnmanagedType.BStr), In] string data, [In] bool flushAndEND = true);
Run Code Online (Sandbox Code Playgroud)
记下最后一个可选参数flushAndEND,其默认值为true.现在的问题是当我在我的项目中使用这个方法时,将鼠标悬停在方法名称上会显示通常的VS toolTip,其中详细说明了方法签名,但对我来说它显示了可选参数的错误默认值flushAndEND.这是一个截图
更糟糕的是,我注意到在运行时,WriteString只使用第一个参数调用方法时,flushAndEND设置为false而不是我引用的DLL中定义的默认值.这对我们的项目的影响是巨大的,因为它使我们的应用程序的一个重要功能无用,并阻止了我们的回归测试的大部分.
我能够通过在调用方法时强制将可选参数的值设置为true来克服此问题,但我担心在项目中的其他地方还有其他调用遇到同样的问题.所以我需要一个更好的解决方案,或者至少要了解这种行为背后的原因.
我们几周前刚刚升级了我们的环境.在我们使用VS2013之前,一切正常.
我知道确认的.Net 4.6错误导致一些参数传递错误的值,我可以将它与我的问题联系起来,但正如文章中所说,只有在编译x64架构时才会出现错误.我的项目是一个WPF应用程序,我们将其编译为x32.
为什么WriteString调用错误的默认参数?
我稍后会尝试在一个小项目中隔离问题,看看我是否可以重现这个问题.
编辑:我设法隔离了问题,发现了一些有趣的东西!
我创建了一个简单的.Net 4.6控制台应用程序,添加了对我的Dll的引用并编写了以下简单代码,包括向设备发送命令并读取响应:
private static void Main(string[] args)
{
//Init managers
ResourceManager ioMgr = new ResourceManagerClass();
FormattedIO488 instrument = new FormattedIO488Class();
//Connect to the USB device
instrument.IO = (IMessage)ioMgr.Open("USB0::0x0957::0x0909::MY46312358::0::INSTR");
string cmd = "*IDN?";
//This is the problematic method from my dll
instrument.WriteString(cmd); …Run Code Online (Sandbox Code Playgroud) 在InotifyDataErrorInfo.GetErrors的msdn页面中,它表示使用参数调用GetErrors方法,该参数可以是:
该文档没有说明何时使用null vs String.Empty调用此方法.我已经在我的应用程序中看到了这两种情况,我需要了解何时我可以期待其中一种情况.
澄清:我不是在问我应该如何实现GetErrors方法(我只是测试null和empty).问题更多的是要理解为什么WPF框架有时尝试使用null调用此方法,有时使用空字符串(我在我的应用程序中遇到了两种情况).如果目的是要求与特定属性无关的错误,为什么只有一个足够的时候为呼叫使用两个不同的值?
一个例子是Windows 10通用平台的新通知API.我可以在WPF应用程序中使用这组API吗?如果是这样有任何限制?
有关此文档的链接将非常感激.
我看到大多数404页面(例如在Html5BoilerPlate中)将CSS包含在<style>标签内的页面的Html代码中,而不是从外部工作表链接.我很确定人们是故意这样做的,并且背后有一些很好的理由,但我无法弄清楚他们为什么会这样做.
在WPF中,有3种验证方法:
IDataErrorInfoINotifyDataErrorInfo是否可以同时使用它们的组合?对于我的需求,我想使用INotifyDataErrorInfo的灵活性来验证新规则,但是不想干扰要验证的同一对象的现有ValidationRules。
我在Visual Studio中从事一个相当复杂的项目。每当我需要将配置从“调试”更改为“发布”时,更改最多需要20秒才能生效。VS在做什么,这证明了这么长的等待时间?
注意:我有一个不错的SSD驱动器和足够的RAM,以确保瓶颈不在硬件中。