使用Lync 2013 SDK的应用程序遇到一些麻烦。这是我所看到的行为:
LyncClient.GetClient()
将返回有效的客户端对象。LyncClient.GetClient()
将引发ClientNotFoundException
。我可以处理该异常,并启动计时器ping以使客户端出现。稍后,当我启动Lync时,LyncClient.GetClient()
将返回一个有效的客户端对象。到目前为止,一切都很好,但是这里出现了问题:
LyncClient.GetClient()
似乎返回一个有效的客户端对象(即使Lync没有运行),但尝试调用此对象throw InvalidCastException
。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()
失败)。
有人看过吗?有什么建议?
我尝试使用此代码获取客户端对象,但行为完全相同:
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()
发生在同一线程上
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句