C#程序仅在调试模式下工作

时间:2014-05-07 20:23:39

标签: c# vnc argumentexception



我和我的一些同事正在共同开展一个项目,遇到了一个我们无法解决的奇怪问题。
该项目涉及在客户端和客户端之间建立VNC连接。服务器,用C#编写(我们使用的是Visual Studio 2010)。我们正在为客户端使用VNCSharp library
我所说的问题是,一旦我们开始与服务器建立连接,就会抛出ArgumentException。
提供的一些信息是:

  

********** 例外文字 **********
  System.ArgumentException:参数无效     在System.Drawing.Bitmap..ctor(Int32宽度,Int32高度,PixelFormat格式)
    在VncSharp.RemoteDesktop.SetupDesktop()
    在VncSharp.RemoteDesktop.Initialize()
    at VncSharp.RemoteDesktop.Connect(String host,Int32 display,Boolean viewOnly,Boolean scaled)
    在VncSharp.RemoteDesktop.Connect(String host)
    在RemoteDesktopTest.Form2.startConnection()

另一个奇怪的事情是,它只会发生一些次,而在其他时候,它的效果非常好。具体来说,它总是在调试模式下运行时(即,当我们使用F11逐行运行程序时),并且在定期运行时工作或不起作用(即Ctrl + F5),没有任何模式我们可以认出来。

我们非常感谢任何和所有的帮助;如果我可以添加任何有助于回答此问题的详细信息,请告诉我。 另外,我为任何语法/拼写错误道歉;英语不是我的第一语言......如果有关于这个问题的事情不合适,我也会道歉。我们都是初学者,这是我们的第一个"大项目",所以这也是我第一次在Stack Overflow中提问。

编辑:
代码的某些部分可能具有相关性 这些是我们将VncSharp控件添加到表单并自定义其设置后自动生成的代码行:

  

this.remoteDesktop1 = new VncSharp.RemoteDesktop();

  this.remoteDesktop1.AutoScroll = true;
  this.remoteDesktop1.AutoScrollMinSize = new System.Drawing.Size(608,427);
  this.remoteDesktop1.Dock = System.Windows.Forms.DockStyle.Fill;
  this.remoteDesktop1.Location = new System.Drawing.Point(0,0);
  this.remoteDesktop1.Name =" remoteDesktop1&#34 ;;
  this.remoteDesktop1.Size = new System.Drawing.Size(1113,580);
  this.remoteDesktop1.TabIndex = 1;

这是我调用Connect方法的代码行,而IP只是从文本框中取出的字符串:

  

remoteDesktop1.Connect(this.IP);

这些来自处理ConnectComplete事件的方法(e是传递给方法的EventArgs对象):

  

this.Location = new Point(0,0);
  this.Size = Screen.PrimaryScreen.WorkingArea.Size;
  this.remoteDesktop1.Size = new System.Drawing.Size(e.DesktopWidth,e.DesktopHeight);

除了调用Disconnect方法的行之外,我们还没有编写任何处理此对象的其他代码行。如果我意识到我忘了某些东西,我会再次编辑并添加它。另外,如果我在这里添加了特定的代码,请告诉我。

3 个答案:

答案 0 :(得分:1)

这个问题似乎与时间有关 在调试模式之外,程序运行得太快,宽度和高度变量没有更新它们的值 幸运的是,VncSharp是开源的,所以只要这两个变量中的任何一个仍然具有默认值,我就可以添加自己的行并将其保留在循环中,现在它可以正常工作。

感谢大家的帮助:)

答案 1 :(得分:0)

有同样的问题。对我来说,它可以在调试模式下编译vncsharp解决方案。

答案 2 :(得分:0)

在RfbProtocol第398行(ReadServerInit方法的第一行)中,我进行了转换

int w = Reader.ReadUInt16();

int w = 0;
while (w == 0)
    w = Reader.ReadUInt16();