我在 PC 上使用 VNCSharp WPF 时遇到了同样的问题,当为 WinForms 测试 VNC Sharp 时,它工作正常。
此外,当我在调试时为 WPF 测试 VNCSharp 时,它工作正常,但在发布时失败。
我已经浪费了几个小时调试它(我已经学习了 VNC 协议的某些部分,因为我发现它以某种方式从网络流中的错误位置读取远程设备的宽度和高度)。
该错误与浮动比较有关。这取决于您拥有的机器(它可能在某些机器上运行良好,而在其他机器上可能不行)
请查看 VncClient,第 349 行:
if (rfb.ServerVersion == 3.8) rfb.ReadSecurityFailureReason();
如果你在调试的时候放一个断点,你会看到 rfb.ServerVersion 是 3.8f
ServerVersion 返回一个计算的浮点数:
public float ServerVersion {
get {
return (float) verMajor + (verMinor * 0.1f);
}
}
您应该期望,因为 ServerVersion 是 3.8,所以它将执行 ReadSecurityFailureReason 读取代码工作所需的一些额外字节,但在发布时(Ctrl+F5,因为在 Visual Studio Release 中,在调试代码时,它可能会正常工作)那些额外的字节将不会被读取,因此宽度和高度将从流上的错误位置读取,导致它是 0px 超过 0px
为了证明我的观点,请使用以下代码,并将其编译为 x86(我假设您有 x64 机器和 x64 操作系统,因为这是这里的情况):
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);
}
}
}
在 Debug x86 中运行代码(使用 Visual Studio 调试器和 Ctrl+F5)您应该看到在这两种情况下都收到消息:“版本为 3.8”。现在将其更改为 Release x86... 使用 F5 运行它。你应该得到消息。现在用 Ctrl + F5 运行它... WTF ??,没有消息!
为了修复 Vnc Sharp WPF 中的错误,我采用了 RfcProtocol 类,并添加了另一个函数:
public bool CompareVersion(int major, int minor)
{
return major == verMajor && minor == verMinor;
}
现在在 VNC 客户端(第 188 行和第 349 行)上,我更改了代码,因此它将使用新函数进行比较,而不是比较 2 个浮点数。