gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:01:21 28 4
gpt4 key购买 nike

注意:更新了问题底部的解决方案

我在使用 Lync 2013 SDK 的应用程序时遇到了一些问题。这是我看到的行为:

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

到目前为止一切顺利,但问题出在这里:

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

异常的详细信息是:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Uc.IClient'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{EE9F3E74-AC61-469E-80D6-E22BF4EEFF5C}' failed due to the following error: The RPC server is unavailable. (Exception from HRESULT: 0x800706BA).

我尝试了这里的建议:Troubleshooting Lync 2013 SDK development issues .它似乎没有任何区别。在 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;
}
}

最佳答案

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

关于c# - 从对 LyncClient.GetClient() 的调用中获取无效对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30667244/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com