我有一个 WCF 服务 (C#),我可以在 Visual Studio 2010 中构建和运行它(通过 Cassini 开发服务器)。我将控制台客户端应用程序连接到该服务并且一切正常。该服务本身加载了一个 COM 对象,并且我的所有代码都按预期工作(到目前为止)。
但是,如果我在 Windows 服务中托管此服务并使用 sc 或 installutil(本地或远程)安装该服务,然后将控制台客户端应用程序连接到同一服务,它仍然可以连接和断开连接,但是当我调用服务时加载 COM 对象的方法,我得到一个异常。每当我在 Windows 服务或 IIS7 64 位中托管服务时,我都目睹了这个异常。
显然 COM 对象已在我的机器上进行了 regsvr32 处理,并且当通过调试器托管时,该服务可以加载 COM 对象。我什至跨过 COM 加载位,该对象看起来很棒,我使用它。我们还有其他使用相同 COM 对象的应用程序。
我认为这(可能)与它是(x86).dll这一事实有关,并且我的开发环境是64位的,并且由于某种原因Cassini开发服务器可以加载COM对象,但是当我托管该服务作为 Windows 服务或在 IIS 中,$path$ 变量或某些环境问题不允许它查找/加载 COM 对象。
至于在 IIS 中托管时,我确实创建了一个新池并启用了 32 位应用程序,但我仍然无法加载 COM 对象。至于 Windows 服务,我不确定我能做什么......
如果我的谷歌搜索没有效果,请原谅我,但我一直无法找到这种确切的情况。
这是标准的未注册 COM 异常:
System.ServiceModel.FaultException\`1 was unhandled
Message=Retrieving the COM class factory for component with CLSID {BB9F026E-EC18-449F-84AA-677225967C07} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Source=mscorlib
StackTrace:
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at methodname(String product, String options, Int32 quantity)
at methodname(String product, String options, Int32 quantity) in ...\Reference.cs:line 70
at ....Program.Main(String[] args) in ...\Program.cs:line 72
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: