我会尽量让这个简短而甜蜜。
我创建了一个应用程序,我的公司每天使用它来拨打大约 2000 个不同的电话号码(用于联系我们在美国部署的非常旧的设备),当我将应用程序作为 Windows 应用程序运行时(使用 C# 和 JulMar 编写ITAPI3 包装器)应用程序似乎运行坚如磐石,没有任何问题,这告诉我至少我的代码大部分是正确的......
我遇到的问题是当我运行与 Windows 服务相同的代码时(创建新项目并像 Windows 应用程序一样简单地调用电话拨号库)该服务将运行一段时间(每次都不同)然后最终会崩溃。我查看事件日志,发现它是应用程序中的 AccessViolation (0xc0000005)。我在调用tapi包装器时尝试捕获异常,但捕获器从未被击中,我假设它只是在应用程序可以回到那个点之前崩溃。
因此,简而言之,Tapi 应用程序在作为 Windows 应用程序运行时运行良好,但在作为 Windows 服务(在本地系统下运行)运行时最终会失败,并出现 AccessViolation 错误,该错误未被围绕“违规”函数调用的 try catch 捕获。
有什么想法吗?
如果有帮助的话,它在 Windows Server 2008 上运行。
编辑 1:我尝试将此服务作为几种不同类型的用户帐户运行,包括本地用户帐户、域帐户、本地系统。他们都出错了。我已经从事件日志中发布了以下故障之一的片段。
Application: EaglePolloutWindowsService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
at <Module>.ATL.CComPtrBase<IUnknown>.{dtor}(ATL.CComPtrBase<IUnknown>*)
at JulMar.Tapi3.Internal.TapiBase.Compare(IUnknown*)
at JulMar.Tapi3.TTapi.FindInterface[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](IUnknown*)
at JulMar.Tapi3.TCall.CreateCallAppearance(JulMar.Tapi3.TAddress, IUnknown*)
at JulMar.Tapi3.TAddress.CreateCall(System.String, JulMar.Tapi3.LINEADDRESSTYPES, JulMar.Tapi3.TAPIMEDIATYPES)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.CreateNewCall(EaglePhoneLibrary.Entities.ConnectionEntity)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.CallTower(EaglePhoneLibrary.Entities.ConnectionEntity)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.ContinueIteration()
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.ContinuePollout(EaglePhoneLibrary.Entities.ConnectionEntity)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout+<>c__DisplayClass52.<CallTower>b__4e(System.Threading.Tasks.Task)
at System.Threading.Tasks.Task+<>c__DisplayClassb.<ContinueWith>b__a(System.Object)
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
at System.Threading.Tasks.Task.ExecutionContextCallback(System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
at System.Threading.Tasks.Task.ExecuteEntry(Boolean)
at System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
感谢大家迄今为止和未来的帮助。
编辑2:我已经放弃尝试解决这个问题。我最好的猜测是,它源于 JulMar 如何处理包装器中创建的一些 COM 对象的问题。我说服我的公司为 TraySoft AddTapi .NET 支付许可证,现在它工作得很好......
感谢大家。