为什么库类项目值中的变量正在改变,但在Windows应用程序项目中,变量值始终为0?

时间:2015-04-26 17:24:34

标签: c# .net winforms

我有两个项目的解决方案。第一个是类库,第二个是Windows窗体应用程序。

我在类库项目的类中添加了一个变量,我不会在这里显示所有代码,因为它很长。

namespace Capture.Hook
{
    public class DXHookD3D9: BaseDXHook
    {
        public DXHookD3D9(CaptureInterface ssInterface)
            : base(ssInterface)
        {
        }

        LocalHook Direct3DDevice_EndSceneHook = null;
        LocalHook Direct3DDevice_ResetHook = null;
        LocalHook Direct3DDevice_PresentHook = null;
        LocalHook Direct3DDeviceEx_PresentExHook = null;
        object _lockRenderTarget = new object();
        Surface _renderTarget;
        public static int framespersecondtodisplay = 0;

        protected override string HookName
        {
            get
            {
                return "DXHookD3D9";
            }
        }

我添加的变量是:framespersecondtodisplay

我在此代码中使用此DXHooKD3D9类中的变量:

if (this.FPS.GetFPS() >= 1)
                        {
                            font.DrawText(null, String.Format("{0:N0} fps", this.FPS.GetFPS()), 5, 5, SharpDX.Color.Red);
                        }

                        if (this.TextDisplay != null && this.TextDisplay.Display)
                        {
                            font.DrawText(null, this.TextDisplay.Text, 5, 25, new SharpDX.ColorBGRA(255, 0, 0, (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f))));
                            framespersecondtodisplay = (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f));
                        }

然后在Windows窗体应用程序项目的form1中,我使用如下变量:

txtDebugLog.Invoke(new MethodInvoker(delegate()
                {
                    fps.Frame();
                    ggg = fps.GetFPS();
                    string s = ggg.ToString("R");
                    txtDebugLog.Text = String.Format("{0:00.0}\r\n{1}", ggg.ToString("N14"), txtDebugLog.Text);
                    txtDebugLog.Text = String.Format("{0}\r\n{1}", DXHookD3D9.framespersecondtodisplay.ToString(), txtDebugLog.Text);

                })               
            );

txtDebugLogTextBox

然后我正在做的是运行Windows窗体应用程序项目,然后在visual studio菜单中选择' Debug' > '附加到流程'并添加两个断点:一行在此行的库类项目的DXHooKD3D9类中:

framespersecondtodisplay = (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f));

它将首先停在此行上,然后我跨过该行,我在framespersecontodisplay中看到值为24。

我继续执行,然后在此行的form1断点处停止:

txtDebugLog.Text = String.Format("{0}\r\n{1}", DXHookD3D9.framespersecondtodisplay.ToString(), txtDebugLog.Text);

但是framespersecondtodisplay的值始终为0.

如果在DXHooKD3D9类的第一个断点处,那里的值总是24,48,244或100 - 那么为什么在form1中它是awlays 0?

由于它没有工作,我试图将类库项目代码更改为:

public static byte framespersecondtodisplay = 0;

但我得到了同样的结果。所以我也尝试将其从static更改为public

public byte framespersecondtodisplay = 0;

然后在form1中为DXHookD3D9创建实例:

CaptureInterface ci;
DXHookD3D9 dxd9;

在构造函数中:

ci = new CaptureInterface();
dxd9 = new DXHookD3D9(ci);

然后:

txtDebugLog.Text = String.Format("{0}\r\n{1}", dxd9.framespersecondtodisplay, txtDebugLog.Text);

framespersecondtodisplay仍然显示为0。

1 个答案:

答案 0 :(得分:-1)

您有两个不同的DXHooKD3D9类实例。调用表单构造函数时,必须将DXHooKD3D9类实例传递给表单,并将其另存为内部变量。或者您可以在任何方法调用中传递实例。您可能正在使用表单中的“new”创建该类的第二个实例。