0

我有一个 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:
4

1 回答 1

0

我相信问题在于我没有在 Windows 的 SysWOW64 目录中使用特殊的 64 位程序(仍称为 regsvr32)注册 .dll。

请参阅: 将 32 位 COM DLL 注册到 64 位 Windows 7

实际上我在发布之前找到了这个解决方案,并认为我已经尝试过并且仍然遇到异常,但也许我错了。这个解决方案似乎奏效了。它甚至可能需要重新启动服务器或至少重新启动 IIS。

于 2013-05-24T15:24:05.843 回答