在 C# 中创建进程外 COM 服务器时,如 Microsoft 的 All-In-One 代码示例中所述:CSExeCOMServer,似乎很难控制在服务器中(由客户端)创建的对象的线程模型。
由于它使用 WPF 对象,正在创建的对象需要在 STA 中,并且它的工厂正在注册,如ExeCOMServer.cs的第 95 行所示并粘贴在下面...
private void PreMessageLoop()
{
//
// Register the COM class factories.
//
Guid clsidSimpleObj = new Guid(SimpleObject.ClassId);
// Register the SimpleObject class object
int hResult = COMNative.CoRegisterClassObject(
ref clsidSimpleObj, // CLSID to be registered
new SimpleObjectClassFactory(), // Class factory
CLSCTX.LOCAL_SERVER, // Context to run
REGCLS.MULTIPLEUSE | REGCLS.SUSPENDED,
out _cookieSimpleObj);
if (hResult != 0)
{
throw new ApplicationException(
"CoRegisterClassObject failed w/err 0x" + hResult.ToString("X"));
}
但是,总是在 MTA 中的新线程中调用 CreateInstance 函数。本地服务器的主线程被标记(并验证)为 STA 线程似乎并不重要。
所发现的所有材料都表明,所创建对象的单元应与工厂注册所在线程的单元相匹配。事实上,这似乎是使用 ATL COM 服务器(与托管 C++ 混合创建对象)时的情况,但这种方法似乎是将一个新线程注入到初始化参数的工作流中,特别是 COM 线程模型, 似乎不可变。
有没有人在不求助于主要用非托管代码编写的 COM 服务器的情况下解决了这个问题。