C# 从WebApi调用STA COM对象

C# 从WebApi调用STA COM对象,c#,asp.net-web-api,com,sta,mta,C#,Asp.net Web Api,Com,Sta,Mta,从MTA线程上下文(.Net WebApi请求)调用STA远程应用程序类型库周围的C#的运行时可调用包装器(从线程模型和公寓角度)安全吗 我应该将服务器STA应用程序更改为MTA还是RCW将在后台处理这些机制?RCW是COM代理的.NET代理。无论您在.NET应用程序的哪个单元上,RCW都将为您处理封送处理 由于对象是远程的,您不必担心单元是否兼容,因为通信会跨越进程。如果您使用的是本地语言和环境,例如C++,您只需担心不必在公寓间共享COM代理,或者换句话说,就要妥善地整理每个公寓中的代理引用

从MTA线程上下文(.Net WebApi请求)调用STA远程应用程序类型库周围的C#的运行时可调用包装器(从线程模型和公寓角度)安全吗


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

RCW是COM代理的.NET代理。无论您在.NET应用程序的哪个单元上,RCW都将为您处理封送处理

由于对象是远程的,您不必担心单元是否兼容,因为通信会跨越进程。如果您使用的是本地语言和环境,例如C++,您只需担心不必在公寓间共享COM代理,或者换句话说,就要妥善地整理每个公寓中的代理引用。 如果对象是进程中的,那么共享同一单元将获得性能,但是在进程之间,封送和线程调度延迟将是最大的开销

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


对于应用程序,您通常无法控制旧公寓。你将如何改变它的公寓?这是COM+组件吗?这是你的密码吗?公寓切换准备好了吗?

基本上我会改为自由线程,并在代码的关键区域应用一些锁定。但与应用程序中的其他功能相比,这种IPC机制很少使用,因此性能不会有问题。我想我会原封不动地离开。我在RCW的类构造函数中遇到了问题,它间歇性地引发类型_e_cantloadlibrary,关闭进程外服务器解决了这个问题,但这不是生产环境的高质量解决方案。因此问题就来了。我相信你说的是进程内服务器(DLL),而不是进程外服务器(EXE,使用代理的DLL)。在注册表中很容易更改进程内服务器的注册单元,但服务器必须支持该类型的单元。更改进程外服务器(不使用代理)使用的单元通常意味着更改代码或使用某些特定于应用程序的设置。对于类型库,类型库可能未正确注册,或者这是一个进程内服务器,其位数与宿主进程不同。尝试将应用程序池的“启用32位应用程序”设置设置为“True”。另外,如果服务器是Office对象,则这是官方不支持的方案。我相信,如果从op的角度(在本例中是您的观点)回答满足问题,则应该接受。通常,与更抽象的问题和/或答案相比,实用编程问题更容易验证和接受。op决定给出的时间主要是他们认为其他人可能会给出更满意的答案,或者对已经足够好的答案发表评论。你不必等待,你应该继续并发布一个新的问题,你可以稍后再接受这个问题的答案。