我尝试过在 C# 上使用 RichTextBox,发现处理数千行长文本时速度太慢。经过一番谷歌搜索,我发现这是因为.net默认使用RichEdit 2.0,解决方案是使用RichEdit 5.0。
C# RichEditBox 性能极慢(加载 4 分钟)已解决
它工作得很好,文本在几秒钟而不是几分钟内显示。然而,作为那种不关心个人项目兼容性的人,我想找到更高版本的 RichEdit。我发现最新版本是8.0,其全部作为riched20.dll发布,部分在msftedit.dll中发布。
http://blogs.msdn.com/b/murrays/archive/2006/10/14/richedit-versions.aspx
http://blogs.msdn.com/b/murrays/archive/2012/03/03/richedit-8-0-preview.aspx
然而,msdn 上的文档到了 4.1 就停止了,(我猜是)该项目的开发人员声称他们不再在上面的博客中提供公共文档。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787873(v=vs.85).aspx
到目前为止,我已经能够显式运行 msftedit.dll 的 RichEdit 2.0 和 5.0,但所有其他版本都无法运行。例如,尽管 John Crenshaw 的评论声称 RichEdit 6.0 工作正常,但我一直无法使用它。除上述 msftedit-2.0 和 5.0 组合之外的任何尝试都会导致 Application.Run() 出现“窗口类名称无效”错误。 (该程序是用 C# 编写的,但我没有对其进行标记,因为我担心这个问题可能不是 C# 特定的问题。)该代码几乎是第一个链接中解决方案的精确副本,如下所示:
class Textbox : RichTextBox
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryW", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern IntPtr LoadLibraryW(string s_File);
public static IntPtr LoadLibrary(string s_File)
{
IntPtr h_Module = LoadLibraryW(s_File);
if (h_Module != IntPtr.Zero)
return h_Module;
int s32_Error = Marshal.GetLastWin32Error();
throw new Exception("LoadLibrary Failed with: "+s32_Error);
}
protected override CreateParams CreateParams
{
get
{
CreateParams i_Params = base.CreateParams;
try
{
// Available since XP SP1
LoadLibrary("MsftEdit.dll"); // throws
i_Params.ClassName = "RichEdit50W";
}
catch
{
// Windows XP without any Service Pack.
}
return i_Params;
}
}
我所做的是将 ClassName 字符串更改为不同的数字,例如RichEdit60W。
我使用的是 Windows 8.1,因此 msftedit.dll 应该具有 RichEdit 7.0 或 8.0(博客文章中给出的措辞不清楚),但我无法访问它们。有什么办法可以纠正这个问题,或者新版本是否保密?