C# Citrix动态虚拟通道错误:找不到支持DVC的传输

C# Citrix动态虚拟通道错误:找不到支持DVC的传输,c#,dynamic,virtual,channel,citrix,C#,Dynamic,Virtual,Channel,Citrix,我无法在Citrix服务器和本地PC之间创建动态虚拟通道。服务器端出现的错误是: CSSession::CreateDynamicChannel:找不到支持DVC的传输= 我在本地PC上注册了一个C++插件作为插件,它似乎正被Citrix接收器的虚拟通道管理器正确加载(我的跟踪日志从初始化到连接一个侦听器到结束点,表明所有的工作都很好)。 但是,当我们在Citrix服务器上启动可执行文件时,会出现上述错误。可执行文件是一个C#/.Net应用程序。该错误是在响应我对WTSVirtualChanne

我无法在Citrix服务器和本地PC之间创建动态虚拟通道。服务器端出现的错误是:

CSSession::CreateDynamicChannel:找不到支持DVC的传输=

我在本地PC上注册了一个C++插件作为插件,它似乎正被Citrix接收器的虚拟通道管理器正确加载(我的跟踪日志从初始化到连接一个侦听器到结束点,表明所有的工作都很好)。 但是,当我们在Citrix服务器上启动可执行文件时,会出现上述错误。可执行文件是一个C#/.Net应用程序。该错误是在响应我对WTSVirtualChannel OpenEx的调用时发生的

我用C#编写的该函数的函数原型如下:

[DllImport("wtsapi32.dll", SetLastError = true)]
private static extern IntPtr WTSVirtualChannelOpenEx(
    [In]
    [param: MarshalAs(UnmanagedType.I4)]
    int SessionId,
    [In]
    [param: MarshalAs(UnmanagedType.LPStr)]
    string VirtualName,
    [In]
    [param: MarshalAs(UnmanagedType.U4)]
    int flags);
_vcHandle = WTSVirtualChannelOpenEx(
    (int)Session.WTS_CURRENT_SESSION,
    pluginName,
    (int)(DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC | DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH)
    );
OpenVirtualChannel.pVCName = CTXPING_VIRTUAL_CHANNEL_NAME;
我对该函数的实际调用如下:

[DllImport("wtsapi32.dll", SetLastError = true)]
private static extern IntPtr WTSVirtualChannelOpenEx(
    [In]
    [param: MarshalAs(UnmanagedType.I4)]
    int SessionId,
    [In]
    [param: MarshalAs(UnmanagedType.LPStr)]
    string VirtualName,
    [In]
    [param: MarshalAs(UnmanagedType.U4)]
    int flags);
_vcHandle = WTSVirtualChannelOpenEx(
    (int)Session.WTS_CURRENT_SESSION,
    pluginName,
    (int)(DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC | DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH)
    );
OpenVirtualChannel.pVCName = CTXPING_VIRTUAL_CHANNEL_NAME;
“pluginName”的值是从配置文件加载的7个字符的字符串

关于动态虚拟通道的Citrix文档说,只需在客户端和服务器端遵循Microsoft API,我已经做到了。该文档指定了如何在客户端注册插件,但没有规定必须在服务器上执行任何额外操作

据我所知,服务器上的虚拟通道管理器从客户机上的虚拟通道管理器获取插件名称列表。然后,服务器端虚拟通道管理器将这些名称存储在一个表中。此后,当任何程序通过动态虚拟通道向客户端插件请求连接时,服务器端虚拟通道管理器会在表中查找名称,然后将连接请求发送到客户端

设置中是否有可能需要执行的操作。例如,管理员是否需要将动态虚拟通道分配给特定的静态虚拟通道号,或者虚拟通道管理器是否在发出请求时动态地(因此称为“动态”)处理该虚拟通道号


我还没能在文档或网络搜索中找到任何关于我们正在经历的那种错误的参考资料

否没有为动态VCs分配VCs。它们通过在一个静态(底层)VC上进行多路复用来工作

你用什么名字来命名“pluginName”?如果查看SDK附带的vdping示例,您将在DriverOpen实现的客户端代码中看到一行代码,如下所示:

[DllImport("wtsapi32.dll", SetLastError = true)]
private static extern IntPtr WTSVirtualChannelOpenEx(
    [In]
    [param: MarshalAs(UnmanagedType.I4)]
    int SessionId,
    [In]
    [param: MarshalAs(UnmanagedType.LPStr)]
    string VirtualName,
    [In]
    [param: MarshalAs(UnmanagedType.U4)]
    int flags);
_vcHandle = WTSVirtualChannelOpenEx(
    (int)Session.WTS_CURRENT_SESSION,
    pluginName,
    (int)(DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC | DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH)
    );
OpenVirtualChannel.pVCName = CTXPING_VIRTUAL_CHANNEL_NAME;
此常量在关联的vdping.h头文件中定义:

#define CTXPING_VIRTUAL_CHANNEL_NAME  "CTXPING"
因此,如果我想在服务器上打开此VD,我需要使用“CTXPING”作为插件名称,您可以在SDK中CTXPING.c中的相关服务器示例代码中看到(注意,这些示例非常旧,因此它们使用Citrix WF API,使用WTSVirtualChannel OpenEx也可以):

除此之外,您只需确保正确地遵循了注册步骤并添加了必要的注册表项。请注意,这些文档是在x64之前创建的。因此,尽管文件中指出:

HKLM\Software\Citrix\ICA Client\etc...
您需要确保改用32位注册表配置单元,因为Windows客户端是32位的:

HKLM\Software\Wow6432Node\Citrix\ICA Client\etc...

谢谢我使用的名称很好,但您关于注册表项的建议可能是问题的指针。我将试用插件所列的注册表项,并在这里发布一条关于结果的评论。干杯