3

这是我的问题......我怀疑我的 C# 屏幕保护程序中的 GDI 资源泄漏只使用托管代码。错误:多次操作后出现“内存不足”。我使用 VS Prof 2013 Update 4 编译并在 Windows 7 64bit 下运行。我尽可能使用Dispose和非静态例程。这是我的问题:

  • 作为一个屏幕保护程序,我什至无法使用 JITdebugger(应用程序加载过程只是挂起)
  • Deleaker 是 C++ 的工具,而不是 C#
  • 详细的 Internet 链接适用于 Windows 9x / Windows 2000(2001 年的 MSDN 杂志)或 Windows 2000 / Windows XP(也是 MSDN 杂志)
  • 无法下载 GDIObj(显然不可用)
  • 我可以在任务管理器中显示“GDO 对象”,但屏幕保护程序使用整个屏幕并在运行时覆盖它
  • ... 也使用来自 NirSoft 的 GDIview(奇怪的是,Explorer.exe 的 GDI 对象数量最多)

因此我的问题是......

  • 开发人员使用 Visual Studio C# 不再有 GDI 资源泄漏?
  • 可以使用 GDI+ 来不断更新屏幕吗?(在模拟应用程序中)
  • 开发人员不再使用 GDI/GDI+ 进行 2.5D 吗?(= 多层 2D)
  • 如果是这样,哪种技术最适合模拟类型的应用程序?
    • 永远运行(理论上)
    • 定期更新整个屏幕中的部分(文本和图形)
    • 实时运行(100 毫秒的差异是可以容忍的,但它必须与无线电时钟保持同步)。
    • 高分辨率图形(到 1920x1080 格式的像素),即不使用 DirectX 的低分辨率游戏;不使用单精度 GPU 算法

C# 几乎成功了!

感谢您的创造性反应...

更新 1

我在 C# 中实现了 GetGuiResources() 如下(代码提取):

using System.Diagnostics;
using System.Runtime.InteropServices;

static class FreeMem
{
    [DllImport("user32.dll")]
    static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags);

    public static int GetGuiResourcesGDICount()
    {
        return (int)GetGuiResources(Process.GetCurrentProcess().Handle, 0);
    }

    public static int GetGuiResourcesUserCount()
    {
        return (int)GetGuiResources(Process.GetCurrentProcess().Handle, 1);
    }
}

我的申请显示

  • GCIcount 稳定在 38 到 42 之间
  • 18 到 19 之间的稳定 UserCount

直到故意(用户)引发的崩溃,然后才显示

  • GCI 计数 = 62
  • 用户数 = 35

即没有什么戏剧性的。

请注意,我经常在 1920 x 1080 像素位图上执行以下操作:

Graphics grTemp = Graphics.FromImage(HighlightedTZ.p_bmpC);
grTemp.DrawImage(DayNight.p_bmp, new Rectangle(0, 0, DayNight.p_bmp.Width, DayNight.p_bmp.Height));
grTemp.Dispose();
4

1 回答 1

0

您可以使用第二个系统来远程调试您的 C# 代码。

如果您只有一台机器可用,您可以使用虚拟机系统创建第二个系统,例如 Oracle 的免费 Virtual Box(我推荐这个),或其他一些 VM 软件。您将需要有效的 Windows 许可证,因为即使您的 VM 软件正在模拟计算机,新操作系统也会将其视为真实计算机。如果您订阅了 MSDN,那么您可以获得额外的操作系统许可证密钥以用于调试和开发目的。

将您的产品放在该 VM 上,在 VM 上安装 Visual Studio 远程窃听器,启动它并确保您可以从主机的 Visual Studio 访问它(通过使用附加到从您的主机的 Visual Studio 处理)。现在您已准备好进行远程调试。

让您的屏幕保护程序在 VM 上启动。启动后,通过使用远程调试器附加到屏幕保护程序来启动主机 VS 调试。现在设置断点和观察点并正常调试。

如果您有第二个可用的 windows 框,那么您不需要虚拟机软件。只需在第二台 Windows 机器上安装您的产品(屏幕保护程序),在其上安装 Visual Studio 远程调试工具集,启动远程调试器,将其设置为允许您访问它,启动您首选机器的 Visual Studio,等待屏幕保护程序在第二台机器上启动,从你的 Visual Studio 附加,设置断点,观察项目,正常调试。

于 2015-02-02T20:58:47.887 回答