小编Jim*_*mmy的帖子

访问冲突:尝试读取或写入受保护的内存

我有一个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().我恰巧正在同时浏览这条评论 …

c# debugging exception-handling access-violation winforms

6
推荐指数
1
解决办法
2万
查看次数

在c#string中摆脱零宽度空间的最简单方法

我在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转换为十进制并搜索那样简单) .

c# regex utf-8 character-encoding

6
推荐指数
1
解决办法
6133
查看次数

在IIS7上使用Joomla重写URL

我在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.但是,也没有答案.

关于如何诊断(甚至更好,修复:))的任何想法?

谢谢!

mod-rewrite seo joomla iis-7

5
推荐指数
1
解决办法
6906
查看次数

如何在重写GetHashCode()的类型上使用Object.GetHashCode()

我有一个实现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 <>,但我希望得到不同的答案.

谢谢

c# iequatable iequalitycomparer gethashcode referenceequals

4
推荐指数
1
解决办法
1482
查看次数

Visual Studio 2017在更改构建配置时挂起

我可以将构建配置从调试更改为发布(或我创建的其他调试配置),但是当我更改回调试时,Visual Studio会冻结.内存使用量不断攀升和攀升,直到Visual Studio在一小时左右后自动重启.

我相信我会在某个时候得到解决.作为临时解决方案,我希望通过更改.suo文件来更改启动时选择的配置.但是,这似乎是一个二进制文件,我认为没有简单的方法来编辑它.除了删除.suo文件之外,还有另一种方法可以选择在启动时选择哪个配置吗?还是建议避免挂?我尝试过轻量级解决方案加载,它没有任何区别.

我删除了.suo文件,并且正如预期的那样,重新创建了一个新文件.新的.suo是6kb大.旧的.suo文件大13MB.

hang buildconfiguration visual-studio-2017

4
推荐指数
1
解决办法
1742
查看次数

MySQL Count子查询

我有一个包含3个表的数据库:

  • 股市
  • stocksplits
  • 分红

股票和股票之间以及股票和股息之间存在一对多的关系.对于每个股权,我想显示股票分割和股息的数量:

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上.

mysql sql subquery aggregate-functions

3
推荐指数
1
解决办法
3万
查看次数

php Exception.getMessage()总是不返回任何内容

当我在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).是什么赋予了?

php exception

3
推荐指数
1
解决办法
2343
查看次数

VSTO 功能区上下文菜单动态层次结构

如何使用 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)

vsto ribbon contextmenu outlook-addin

3
推荐指数
1
解决办法
1419
查看次数

c#FileInfo存在,对于文件的网络路径返回false

尝试以下..

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.

所以它可以找到路径而不是文件?

有什么理由吗?

c# file

2
推荐指数
1
解决办法
8623
查看次数

Visual Studio 2017 Winforms 设计器缓存在哪里?

当尝试打开我的其中一个表单时,我从 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

2
推荐指数
1
解决办法
1746
查看次数

如何禁用整个 .net DataGridView 列的工具提示

我有一个包含一列按钮的 winform datagridview。我只想禁用该列的工具提示——工具提示仍应显示在其他列中。我发现工具提示妨碍了点击按钮——当点击工具提示时,点击事件不会渗透到按钮上。很烦人。

我已经尝试处理 CellTooltipNeeded 事件并为该列返回 null 或空字符串,但是工具提示只是恢复为在工具提示中显示按钮文本。我还尝试将 Column.ToolTipText 设置为空字符串,这正确隐藏了列标题的工具提示,但所有其他行的工具提示仍然显示。

禁用整个列的工具提示的最佳方法是什么?

谢谢吉米

.net datagridview tooltip winforms

1
推荐指数
1
解决办法
3082
查看次数

使SortableBindingList使用稳定排序的最简单方法

有一个如何修改SortableBindingList以使用稳定排序的示例.但是,有一个SortableBindingList更新版本.修改此新版本以使用稳定排序的最佳方法是什么?我想我希望SortableBindingList上有一个标志让SortableBindingList的用户决定是否要使用(较慢)稳定排序或(更快)默认排序.

谢谢

c# sorting bindinglist

1
推荐指数
1
解决办法
2516
查看次数

如何枚举枚举,跳过默认值

当我声明枚举时,我经常添加一个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 <>.

.net enums

1
推荐指数
1
解决办法
187
查看次数