我一直在PC上使用VNCSharp WPF时出现同样的问题,当测试VNC Sharp for WinForms时,它的工作正常。此外,当我在Debug上测试了WPF的VNCSharp时,它工作正常,但在发布时失败。
我已经浪费了几个小时的时间调试它(我已经了解了VNC协议的某些部分,因为我发现它以某种方式从错误的位置读取远程设备的宽度和高度在netowrk流中)。
该错误与浮点数比较有关。这取决于你在机器上(它可能在某些机器上运作良好,对他人也可能不)
请看VncClient,线349:
if (rfb.ServerVersion == 3.8) rfb.ReadSecurityFailureReason();
如果,在调试时,把一个断点在那里,你会看到rfb.ServerVersion是3.8f
ServerVersion返回calcualted浮动:
public float ServerVersion {
get {
return (float) verMajor + (verMinor * 0.1f);
}
}
你应该想到的是,因为ServerVersion是3。8,那么它将执行 ReadSecurityFailureReason读取代码工作所需的一些额外字节,但在发布(Ctrl + F5,因为在Visual Studio Release中,在代码被调试时,它可能工作正常)额外的字节将不会被读取,所以宽度和高度将从流中的错误位置读取,导致它在0px上为0px。
对于demontrating我的观点,请采取以下代码,并将其编译为x86 (我假设你有一个64位机和64位操作系统,因为这是这里的情况):
class Program
{
static void Main(string[] args)
{
SomeVersion someVersion = new SomeVersion(3, 8);
if (someVersion.Version == 3.8f)
{
Console.WriteLine("Version is 3.8");
}
Console.ReadLine();
}
}
public class SomeVersion
{
private int _major;
private int _minor;
public SomeVersion(int major, int minor)
{
_major = major;
_minor = minor;
}
public float Version
{
get
{
return (float)_major + (_minor * 0.1f);
}
}
}
(均与Visual Studio调试器和用Ctrl + F5)运行在调试的x86代码 您应该看到,在两种情况下都会收到消息:“版本为3.8”。 现在将其更改为发行版x86 ...使用F5运行它。你应该得到消息。 现在运行它与Ctrl + F5 ... WTF ??,没有消息!
为了解决在VNC夏普WPF的bug,我已经采取了类RfcProtocol,并添加另一个功能:
public bool CompareVersion(int major, int minor)
{
return major == verMajor && minor == verMinor;
}
现在的VNC客户端(包括线188和349),我已经改变了代码,所以它会使用新函数进行比较,而不是比较两个浮点数。
嗨Saragani,谢谢你的回复。 – angelhalo
加1用于指出Bug并提供解决方案。 –