【问题标题】:Unable to create an object of com components written in unmanaged code from .Net wcf service无法从 .Net wcf 服务创建用非托管代码编写的 com 组件的对象
【发布时间】:2013-02-14 07:46:45
【问题描述】:

我正在编写一个 Wcf 服务库并想加载一个非托管 com dll。未设置 com dll 线程模型,因此它是仅在主 STA 中运行的单线程遗留组件threading model

在wcf服务中,我将公寓设置为STA like

现在当我尝试创建 com 组件的实例时,它给出了一个异常

System.Runtime.InteropServices.SEHException : External component has thrown an exception.

当我调试 com dll 时,它抛出了一个错误 RPC_E_WRONG_THREAD

我可以通过将线程模型设置为Free Threaded Marshaller 来解决此问题。但是我不允许更改 com dll 的当前线程模型。

那么请帮助我,如何从 wcf 服务访问 com dll?

.Net Framework 4.0,Windows 7 x64

【问题讨论】:

  • 事实上,我可以通过将单元设置为 STA 从简单的 C# 控制台应用程序访问 COM dll,因为我是从与 COM dll 的线程模型匹配的主线程访问它。
  • 但在 wcf 服务中,我试图通过工作线程(即 STA)访问 COM,因此无法访问它。那么有什么办法可以从WCF服务的主线程访问COM????

标签: visual-studio-2010 wcf com wcf-client apartments


【解决方案1】:

嗯,终于问题解决了……

步骤:

  1. 将 wcf 服务库托管到 WindowsForm 应用程序中。
  2. 将 WindowsForm 应用的线程单元设置为 STA
  3. 将wcf服务中定义的dispatcher设置为当前dispatcher like

    WcfTest.Service1.disp = System.Windows.Threading.Dispatcher.CurrentDispatcher;

仅此而已:)

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2020-05-03
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多