从WebApi调用STA COM对象

问题描述:

C#的运行时环境是否可以从MTA线程上下文(.Net WebApi请求)中调用STA远程应用程序类型库的安全(从线程模型和公寓透视图)?从WebApi调用STA COM对象

我应该将服务器STA应用程序更改为MTA还是RCW将在幕后处理这些机制?

RCW是COM代理的.NET代理。无论您在.NET应用程序中使用哪个公寓,RCW都会为您处理编组。

而且由于对象是远程的,您不需要担心公寓是否兼容,通信就会跨越流程。如果您使用的是本地语言和环境(例如C++),则只需担心不要跨公寓共享COM代理,换句话说,就是为了在每个公寓中正确编组代理引用。

如果对象正在处理中,您将获得共享相同公寓的性能,但在进程之间,编组和线程调度延迟将是最大的开销。

但是,您应该考虑其他应用程序使用的是哪个单元。使用STA的应用程序将是单线程的,因此这将成为ASP.NET应用程序的瓶颈。如果它使用MTA,可能不会,如果它不同步所有的呼叫或者如果关键部分很快。

对于应用程序,您通常无法控制使用的公寓。你将如何改变它的公寓?这是一个COM +组件吗?这是你的代码吗?它是否准备好了公寓开关?

+0

基本上我会改变为*线程并在代码的关键区域应用一些锁定。但与应用程序中的其他功能相比,此IPC机制很少使用,因此性能不会成为问题。我想我会离开的。 – EProgrammerNotFound

+0

我在RCW的类构造函数中遇到了问题,它间歇性地引发了type_e_cantloadlibrary,关闭了pro-proc服务器解决方案,但这不是生产环境的高质量解决方案。因此,这个问题。 – EProgrammerNotFound

+1

我相信你在谈论一个进程内服务器(DLL),而不是一个进程外服务器(EXE,使用代理的DLL)。更改在注册表中轻松完成的进程内服务器的注册公寓,但服务器必须支持该类型的公寓。更改由进程外服务器(不使用代理程序)使用的公寓通常意味着更改代码或使用某些特定于应用程序的设置。 – acelent