从对LyncClient.GetClient()的调用中获取无效的对象

丹·班切尔(danBhentschel)

注意:已在问题底部添加了解决方案

使用Lync 2013 SDK的应用程序遇到一些麻烦。这是我所看到的行为:

  • 如果启动我的应用程序时Lync已经在运行,则对的调用LyncClient.GetClient()将返回有效的客户端对象。
  • 如果启动我的应用程序时Lync没有运行,则对的调用LyncClient.GetClient()将引发ClientNotFoundException我可以处理该异常,并启动计时器ping以使客户端出现。稍后,当我启动Lync时,LyncClient.GetClient()将返回一个有效的客户端对象。
  • 如果Lync在我的应用程序运行时退出,那么我可以通过多种方式检测到这种情况,并启动计时器ping以使客户端返回。

到目前为止,一切都很好,但是这里出现了问题:

  • 如果在我的应用程序运行时Lync消失,则后续调用LyncClient.GetClient()似乎返回一个有效的客户端对象(即使Lync没有运行),但尝试调用此对象throw InvalidCastException
  • 即使在Lync重新启动之后,后续的调用LyncClient.GetClient()仍然返回InvalidCastException我尝试访问它时抛出的对象

异常的详细信息是:

无法将类型为“ System .__ ComObject”的COM对象转换为接口类型为“ Microsoft.Office.Uc.IClient”。由于以下错误,此操作失败是因为对具有IID'{EE9F3E74-AC61-469E-80D6-E22BF4EEFF5C}'的接口的COM组件上的QueryInterface调用由于以下错误而失败:RPC服务器不可用。(来自HRESULT的异常:0x800706BA)。

我在这里尝试了以下建议:对Lync 2013 SDK开发问题进行故障排除似乎没有什么区别。Lync运行并再次登录后,我继续收到无效的客户端对象很多分钟。

这并非每次都会发生。如果在我的应用程序启动时Lync已经在运行,则该问题似乎会持续发生(即,第一次LyncClient.GetClient()成功调用。)另一方面,如果在我的应用程序已经启动后启动Lync,则在Lync的多次重新启动中一切正常正在运行(即第一次尝试GetClient()失败)。

有人看过吗?有什么建议?


尝试卸载AppDomain进行更新

我尝试使用此代码获取客户端对象,但行为完全相同:

public class LyncClientProvider
{
    private AppDomain _domain = CreateDomain();

    public LyncClient GetLyncClient()
    {
        if (_domain == null) CreateDomain();
        var client = GetClient();
        if (client != null && client.Capabilities != LyncClientCapabilityTypes.Invalid) return client;

        // Reload AppDomain
        if (_domain != null) AppDomain.Unload(_domain);
        _domain = CreateDomain();
        return GetClient();
    }

    private LyncClient GetClient()
    {
        if (_domain == null) return null;
        return ((InternalProvider)
            _domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName,
                typeof (InternalProvider).FullName)).GetLyncClient();
    }

    private static AppDomain CreateDomain()
    {
        return AppDomain.CreateDomain("LyncClientCreator", null, new AppDomainSetup
        {
            ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
            ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
        });
    }

    [Serializable]
    private class InternalProvider
    {
        public LyncClient GetLyncClient()
        {
            try
            {
                return LyncClient.GetClient();
            }
            catch (Exception)
            {
                return null;
            }
        }
    }
}

使用专用线程的解决方案示例

感谢djp的输入,我实现了这个简单的类来提供LyncClient,并且重新连接现在可以正常工作。

public class LyncClientProvider
{
    private Thread _thread;
    private volatile bool _running;
    private volatile bool _clientRequested;
    private volatile LyncClient _lyncClient;

    private void MakeClientLoop()
    {
        while (_running)
        {
            if (_clientRequested) MakeClient();
            Thread.Sleep(100);
        }
    }

    private void MakeClient()
    {
        try
        {
            _lyncClient = LyncClient.GetClient();
        }
        catch (Exception)
        {
            _lyncClient = null;
        }
        _clientRequested = false;
    }

    public void Start()
    {
        if (_running) return;
        _running = true;
        _thread = new Thread(MakeClientLoop);
        _thread.Start();
    }

    public void Stop()
    {
        if (!_running) return;
        _running = false;
        _thread.Join();
        _clientRequested = false;
    }

    public LyncClient GetLyncClient()
    {
        if (!_running) return null;
        _clientRequested = true;
        while (_clientRequested) Thread.Sleep(100);
        return _lyncClient;
    }
}
djp

我遇到了同样的问题,对我来说,解决方法是确保每次调用都LyncClient.GetClient()发生在同一线程上

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从对LyncClient.GetClient()的调用中获取无效的对象

来自分类Dev

C#LyncClient:获取Lync用户的状态信息

来自分类Dev

LyncClient卡在“登录”循环中

来自分类Dev

IE中的无效调用对象错误

来自分类Dev

IE中的FancyBox发生“无效的调用对象”

来自分类Dev

无效的调用对象IE

来自分类Dev

for 循环开始时 IE 中的调用对象无效

来自分类Dev

在Swift扩展中,获取实际的调用对象?

来自分类Dev

从异步调用中仅获取对象

来自分类Dev

从异步调用中仅获取对象

来自分类Dev

获取在 Python 中调用方法的对象

来自分类Dev

获取“消息中的WS Security Header无效”。调用ACAGetTransmitterBulkRequestStatus时

来自分类Dev

Trello API:在所有调用中获取无效令牌

来自分类Dev

在 Swift 中调用 JSONSerialization 时获取无效的 json

来自分类Dev

IE 11在尝试调用HTTP获取请求时给出“无效的调用对象”

来自分类Dev

在JavaScript中获取对象字段并调用对象函数

来自分类Dev

GetClient调用上Redis超时过期消息

来自分类Dev

xsd验证,获取无效的对象

来自分类Dev

对象中的无效键

来自分类Dev

获取调用函数的对象

来自分类Dev

获取块的调用对象

来自分类Dev

如何在R中的调用函数环境中获取对象?

来自分类Dev

获取Python 2.7中调用者的函数对象?

来自分类Dev

在Firebase中调用push()后如何获取新对象的autoID?

来自分类Dev

获取调用Java中特定方法的对象的hashCode()

来自分类Dev

在Firebase中获取API调用的空对象列表

来自分类Dev

在Firebase中调用push()后如何获取新对象的autoID?

来自分类Dev

从REST调用中获取JSON对象并填充类的方法

来自分类Dev

无效的调用对象和兼容性

Related 相关文章

热门标签

归档