只是偶然发现了一个简单的错误,它提示了一个有趣的问题.环境:VS 2010,NET.4,C#.从SQL sproc获取返回值会产生"指定的强制转换无效"异常:
cm.Parameters.Add( "@si", SqlDbType.SmallInt ).Direction= ParameterDirection.ReturnValue;
..
cm.ExecuteNonQuery( );
short siRetVal= (short) cm.Parameters[0].Value; // exception here
Run Code Online (Sandbox Code Playgroud)
由于代码在调试模式下运行并在该行中断,我输入了立即窗口:
?(short) cm.Parameters[0].Value
Run Code Online (Sandbox Code Playgroud)
结果是:
Cannot unbox 'cm.Parameters[0].Value' as a 'short'
Run Code Online (Sandbox Code Playgroud)

好吧,SQL sproc返回一个32位int(不是short我最初想到的16位),这解释了异常.应该为此参数使用适当的宽度 - 没有问题.
但任何人都可以解释为什么错误的根本原因仅在立即窗口中报告?Exception Helper中没有公开任何细节,内部异常为空.知道确切原因不是有益的吗?我认为它会使错误分析更简单,不是吗?
编辑:添加截图; 堆栈跟踪似乎没有暗示任何ADO.NET代码(我没想到).更重要的是,如果我将ret-value参数"声明"保留为SmallInt,但提供一个适当宽度的变量(或如图所示),适应一个int,一切正常!我很确定这与ADO/SQL没有任何关系.
我相信@HansPassant揭示了这里发生的事情的真实本质,我倾向于接受这个作为答案.尽管发现托管代码甚至无法向我提供有关执行状态的准确详细信息(例如,哪个引用实际上为null - 如上所述,或者在此无效转换的情况下),这有点令人失望.
我正致力于自动化.NET 4.0 ClickOnce WPF应用程序的安装程序,该应用程序需要在app.config文件中设置一些项目.我已经经历了一个棘手的过程,即找到我必须遵循的特定步骤,使用Mage.exe(即更新并重新签名应用程序和部署清单),现在我正在尝试将其自动化以进行安装.
我选择使用.deploy扩展来最小化IIS/Internet Explorer安全机制的问题,因此基本上算法如下(基于ClickOnce(Saurabh Bhatia)中的签名和重新签名清单以及使用Mage的ClickOnce WPF应用程序的更新配置或MageUI,作为主要来源之一):
\Application Files\App_%HighestVersion%\文件夹mage -u %app%.exe.manifest -cf cert.pfxmage -u %app%.application -appm %app%.exe.manifest -cf cert.pfx%app%.application2级(到..\..- 部署根)如果手动完成,那将非常有效.我可以运行一个.cmd文件,根据环境细节(路径等)进行自定义,但是我需要包含mage.exe在部署中,以及Microsoft是否允许我们这样做对我来说是一个悬而未决的问题.因此,我正在尝试在Installer课堂上执行类似的操作:
X509Certificate2 ct = new X509Certificate2(sPathCert);
// .. Remove .deploy extension (for files in the sPathApp folder).
sPathMft = Directory.GetFiles(sPathApp, "*.exe.manifest")[0];
ApplicationManifest am = …Run Code Online (Sandbox Code Playgroud) 调试一个奇怪的NullRefException我看到如下图:

所以当代码引用.SelectedValue它崩溃时.
我无法理解如何.SelectedItem设置,但.SelectedValue不能.调试器查看器中显示的值是正确的,.SelectedIndex也是合适的.ComboBox .ItemsSource设置为List<DvcTypes>代码:
cbAdmDvc.ItemsSource = J790M.DAL.DvcTypes.GetList( );
Run Code Online (Sandbox Code Playgroud)
.SelectedValuePath 在XAML中设置:
<ComboBox Name="cbAdmDvc" DisplayMemberPath="sDvcType"
SelectedValuePath="tiDvcType" SelectionChanged="cbAdmDvc_SelectionChanged".. />
Run Code Online (Sandbox Code Playgroud)
下拉部分.sDvcType稍后正确显示标签.
非常相同的实现适用于一堆其他过滤组合框(另外7个).
这在主窗口的Loaded事件期间发生.
我们的WebSetupProjects(在VisualStudio 2010中创建)无法正确检测Win10上的IIS版本.
我的想法是它与这个条件拼写的方式有关 - 请注意双引号:
(IISMAJORVERSION >= "#5" AND IISMINORVERSION >= "#1") OR IISMAJORVERSION >= "#6"
Run Code Online (Sandbox Code Playgroud)
所以即使注册表检查在HKLM\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters用于MajorVersion和MinorVersion返回双字整数值,它们被强制为字符串表示,因此导致"10"是少比"5"或"6" -因此不能检查.
我还没有尝试删除双引号,但我担心它们可能存在原因(即没有它们检查将无法正常工作).不过,一旦我有机会,我会尝试这一点,并会报告.
在此期间,有没有人遇到过相同的场景,并找到了如何解决它?