我有一个ac#(.net 4.0)winforms应用程序,每天每天工作8小时,在XP SP 3上运行.它在大多数情况下工作正常,有时持续数月.然后它似乎陷入了一个糟糕的咒语,并且每天一次,连续几天,在不同的时间,出现访问冲突异常.我已经尝试查看转储文件,并捕获访问冲突异常以查看堆栈; 无论哪种方式,我得到几乎相同的堆栈:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.ToolTip.WndProc(Message& msg)
at System.Windows.Forms.ToolTip.ToolTipNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
Run Code Online (Sandbox Code Playgroud)
我很难解决这个问题,因为堆栈跟踪不是很有用.首先,我甚至不确定我是否可以信任堆栈跟踪:程序是否到达那里(看起来它正在尝试显示一些工具提示,这当然是可能的)因为内存已经损坏,或者程序确实应该合法地那里,但有些数据内存已损坏.其次,假设堆栈跟踪是正确且值得信赖的,我没有找到一种方法来弄清楚什么是破坏内存...我们没有做任何一致的事情来触发访问冲突...应用程序日志没有显示任何在此之前其他被捕获的异常...事件日志不会与访问冲突同时显示任何条目...有关如何进一步诊断此问题的任何提示?
更新2011-10-11:我已经捕获了异常,但围绕Application.Run()方法.那时似乎为时已晚太多了.如果由于硬件/驱动程序错误而发生此异常并且未指示应用程序的内存已损坏 - 是否还有其他地方可以捕获异常(并显示它,然后让应用程序继续)?
更新2012-03-04:我再次获得异常,这次显示一个相当简单的表单(只包含一个文本框和一个ok按钮).我使用的是TextBox.AppendText().我恰巧正在同时浏览这条评论 …
我在ac#VSTO项目中使用正则表达式解析电子邮件.偶尔,正则表达式似乎不起作用(尽管如果我在regexbuddy中粘贴文本和正则表达式,正则表达式正确匹配文本).如果我看一下gmail中的电子邮件,我明白了
=E2=80=8B
Run Code Online (Sandbox Code Playgroud)
在一些行的开头和结尾(我理解的是UTF8零宽度空间); 这似乎搞乱了正则表达式.这似乎只是序列出现了.
摆脱这个确切序列的最简单方法是什么?我做不了明显的事
MailItem.Body.Replace("=E2=80=8B", "")
Run Code Online (Sandbox Code Playgroud)
因为这些字符没有显示在c#字符串中.
我也试过了
byte[] bytes = Encoding.Default.GetBytes(MailItem.TextBody);
string myString = Encoding.UTF8.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
但零宽度空间只是显示为?我想我可以通过字节数组并删除包含零宽度空间的字节,但我不知道字节会是什么样子(它似乎不像将E2 80 8B转换为十进制并搜索那样简单) .
我在IIS7上运行Joomla 1.5.9.我现在正在试验Joomla全局配置页面中的SEO设置.
首先,我玩弄了搜索引擎友好URL(删除了URL的查询部分); 工作正常.
我还尝试启用"使用Apache mod_rewrite".我安装了"用于IIS 7.0的Microsoft URL重写模块",并根据http://learn.iis.net/page.aspx/527/joomla-on-iis添加了web.config .单击菜单链接时,这似乎有效,因为我不再在URL中看到index.php.地址栏会更新为正确的URL,但显示的内容始终是主页的内容.我在IE和谷歌Chrome中都试过了同样的结果.加载后刷新页面没有任何区别.
我尝试重新启动IIS7,它没有什么区别.
编辑:我按照下面的建议(按照http://www.mydotnetworld.com/post/2008/10/24/URL-Rewriting-In-Joomla-15-on-IIS-7.aspx上的说明开启:打开快速cgi,修改php.ini,并导入重写规则,而不是将它们放在web.config中),我现在得到404而不是只显示主页的内容.URL似乎仍然被正确重写.所以,不同的行为,但仍然不起作用.我不确定这是有用的信息,但这两个字段显示在404页面中:请求的URL http:// localhost:80/joomla_course /季节性特色 物理路径C:\ inetpub\wwwroot\joomla_course\seasonal-specialties物理路径应该是"未重写"的URL吗?或者它是否预期会像这样?
编辑2:Oho!我发现在Joomla论坛上发布了同样问题的人:http://forum.joomla.org/viewtopic.php?f = 533&t = 364706&p = 1598137#p1598137.但是,也没有答案.
关于如何诊断(甚至更好,修复:))的任何想法?
谢谢!
我有一个实现IEquatable <>的类A,使用它的字段(比如Ab和Ac)来实现/重写Equals()并覆盖GetHashCode(),并且99%的时候一切正常.A类是层次结构(B类,C类)的一部分,它们都从接口D继承; 它们都可以一起存储在字典中,因此当它们都带有自己的默认Equals()/ GetHashCode()时很方便.
然而,在构建AI时,有时需要做一些工作来获得Ab和Ac的值; 当发生这种情况时,我想存储对正在构建的实例的引用.在这种情况下,我不想使用A提供的默认Equals()/ GetHashCode()覆盖.因此,我正在考虑实现一个ReferenceEqualityComparer,这意味着强制使用Object的Equals()/ GetHashCode() :
private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
{
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
return System.Object.ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
// what goes here? I want to do something like System.Object.GetHashCode(obj);
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
问题是,由于A重写了Object.GetHashCode(),我如何(在A之外)调用Object.GetHashCode()作为A的实例?
当然,一种方法是A不实现IEquatable <>并且始终为我创建的任何字典提供IEqualityComparer <>,但我希望得到不同的答案.
谢谢
我可以将构建配置从调试更改为发布(或我创建的其他调试配置),但是当我更改回调试时,Visual Studio会冻结.内存使用量不断攀升和攀升,直到Visual Studio在一小时左右后自动重启.
我相信我会在某个时候得到解决.作为临时解决方案,我希望通过更改.suo文件来更改启动时选择的配置.但是,这似乎是一个二进制文件,我认为没有简单的方法来编辑它.除了删除.suo文件之外,还有另一种方法可以选择在启动时选择哪个配置吗?还是建议避免挂?我尝试过轻量级解决方案加载,它没有任何区别.
我删除了.suo文件,并且正如预期的那样,重新创建了一个新文件.新的.suo是6kb大.旧的.suo文件大13MB.
我有一个包含3个表的数据库:
股票和股票之间以及股票和股息之间存在一对多的关系.对于每个股权,我想显示股票分割和股息的数量:
SELECT equities.Symbol,
(SELECT COUNT(*)
FROM stocksplits
WHERE stocksplits.EquityID = equities.InstrumentID) as `# Splits`,
(SELECT COUNT(*)
FROM dividends
WHERE dividends.EquityID = equities.InstrumentID) as `# Dividends`
FROM equities
Run Code Online (Sandbox Code Playgroud)
该查询似乎运行正常,但我怀疑它是低效的.怎样才能更快地重构?没有DBMS(通过.net到MySQL服务器的SQL查询),假设索引存在于每个表的主ID上.
当我在php中捕获异常并尝试输出一些细节时,getMessage()总是不返回任何内容.如果我执行var_dump(),我会看到要显示的消息.我究竟做错了什么?
try
{
...
}
catch (Exception $e)
{
echo "<p>Exception: " . $e->getMessage() . "</p>";
return;
}
Run Code Online (Sandbox Code Playgroud)
如果我做var_dump($ e)我得到以下输出:
object(ETWSException)#735(10){["errorCode":protected] => int(401)["errorMessage":protected] => string(226)"HTTP/1.1 401未授权日期:2015年8月21日星期五18 :26:30 GMT服务器:Apache WWW-Authenticate:OAuth realm = https://etws.etrade.com/,oauth_problem=token_expired 内容长度:995内容类型:text/html; charset = utf-8"[" httpCode":protected] => NULL ["message":protected] => string(0)""["string":"异常":private] => string(0)""["code":protected] = > int(0)["file":protected] => [snip!]
我认为getMessage()应该显示errorMessage的内容.
嗯,我试过$ E-> getErrorMessage()和这显示预期的消息.搜索谷歌的php异常getErrorMessage似乎没有显示任何有用的东西(所有页面似乎只提到getMessage,而不是getErrorMessage).是什么赋予了?
如何使用 VSTO Ribbons(对于 Outlook 2016)创建动态菜单层次结构?
xml 占位符可能看起来像这样,但我需要在菜单根目录下添加/删除菜单树(而不是 dummySingle)。似乎菜单项需要像“getDependents”回调之类的东西。
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<contextMenus>
<contextMenu idMso="ContextMenuMailItem">
<menu id="Menu Root" label="Menu Root" >
<button id="dummySingle"
label="dummy"
onAction="DummyAction"/>
</menu >
</contextMenus>
</customUI>
Run Code Online (Sandbox Code Playgroud) 尝试以下..
bool success = File.Exists(@"\\comp01\BatchFiles\InputFile\Test.txt");
Run Code Online (Sandbox Code Playgroud)
它的返回false(文件确实存在)
当我尝试
var dirInfo = new DirectoryInfo(@"\\comp01\BatchFiles\InputFile");
if (dirInfo.Exists)
Run Code Online (Sandbox Code Playgroud)
它回来了true.
所以它可以找到路径而不是文件?
有什么理由吗?
当尝试打开我的其中一个表单时,我从 Visual Studio Designer 中收到一些烦人的错误(无法从程序集 y 加载类型 x,即使程序集 y 明确包含类型 x;项目构建并运行良好)。对我来说,这看起来像是 Visual Studio Designer 缓存问题。我环顾四周,似乎 Visual Studio Designer 使用了 ShadowCache,通常可以在以下位置找到
C:\Users\%UserName%\AppData\Local\Microsoft\VisualStudio\15.0_6d397e1a\Designer\ShadowCache
但是,该文件夹是空的。这对我来说,必须有一些其他的缓存位置,因为我正在使用设计器来做其他一些事情,设计器缓存位置中至少应该有一些东西......
windows-forms-designer visual-studio winforms visual-studio-2017
我有一个包含一列按钮的 winform datagridview。我只想禁用该列的工具提示——工具提示仍应显示在其他列中。我发现工具提示妨碍了点击按钮——当点击工具提示时,点击事件不会渗透到按钮上。很烦人。
我已经尝试处理 CellTooltipNeeded 事件并为该列返回 null 或空字符串,但是工具提示只是恢复为在工具提示中显示按钮文本。我还尝试将 Column.ToolTipText 设置为空字符串,这正确隐藏了列标题的工具提示,但所有其他行的工具提示仍然显示。
禁用整个列的工具提示的最佳方法是什么?
谢谢吉米
有一个如何修改SortableBindingList以使用稳定排序的示例.但是,有一个SortableBindingList的更新版本.修改此新版本以使用稳定排序的最佳方法是什么?我想我希望SortableBindingList上有一个标志让SortableBindingList的用户决定是否要使用(较慢)稳定排序或(更快)默认排序.
谢谢
当我声明枚举时,我经常添加一个NOT_SET = 0值来知道实例何时尚未初始化.当我枚举这种枚举的值时(如此处和此处所述),丢弃NOT_SET值的最佳方法是什么?我能想到的最好的是
Enum.GetValues(typeof(T)).Cast<int>().Where(item => (0 != (int)item)).Cast<T>();
Run Code Online (Sandbox Code Playgroud)
我不喜欢它,因为与所有那些Cast <>的迭代太多了.我更喜欢基于的东西
(T[]) Enum.GetValues(typeof(T))
Run Code Online (Sandbox Code Playgroud)
没有所有的Cast <>.
c# ×5
winforms ×3
.net ×2
bindinglist ×1
contextmenu ×1
datagridview ×1
debugging ×1
enums ×1
exception ×1
file ×1
gethashcode ×1
hang ×1
iequatable ×1
iis-7 ×1
joomla ×1
mod-rewrite ×1
mysql ×1
php ×1
regex ×1
ribbon ×1
seo ×1
sorting ×1
sql ×1
subquery ×1
tooltip ×1
utf-8 ×1
vsto ×1