.net - COM 互操作 .NET STA

标签 .net com-interop

如果我在 .NET 中有一个 STA 线程,并且我在该线程中创建了一个 STA COM 对象,然后该线程结束——这是否会杀死该对象的实例?

我的理解是否正确,STA COM 对象可以被多个线程访问并且运行时将自动编码对所有发生在公寓线程中的调用?该线程是创建实例的线程吗?因此,如果该线程完成,该实例将孤立并丢失?或者是否为 STA 实例创建了单独的线程?
这如何在 ASP.Net 中使用 ASPCompat=True 进行?我的理解是每个请求都由一个随机的工作线程处理,如果我的 STA 组件被放入 session 中,它是否会随机死亡,因为创建它的请求处理器线程可能已经完成?

最佳答案

如果您在 .NET STA 线程上创建 STA COM 对象,则对您的对象的所有调用都将编码到该线程。

如果您在 .NET MTA 线程上创建 STA COM 对象,则运行时将创建一个 STA 线程并编码对该线程的所有调用。

因此,当您的 (STA) 线程存在时,您的 COM 对象将无法访问。

一种解决方案可能是在您可以控制其生命周期的新线程上创建对象。

我做过类似的事情:

using (ManualResetEventSlim mre = new ManualResetEventSlim(false))
{  
    Thread _STAThread = new Thread(new ThreadStart(() =>
                {
                    globalComObject = new ComClass();
                    mre.Set();
                    try
                    {
                        Thread.CurrentThread.Join();
                    }
                    catch (ThreadAbortException)
                    {
                    }
                }));
                _STAThread.SetApartmentState(ApartmentState.STA);
                _STAThread.IsBackground = true;
                _STAThread.Start();
                mre.Wait();
}

该代码启动一个新线程,将公寓设置为 STA 并等待在该线程上创建 COM 对象。
线程本身一直在运行,直到您的应用程序退出 (IsBackground = true) 或您使用 Thread.Abort() 显式终止线程。

但请记住,对您的 COM 对象的所有调用都被编码,因此在该线程上一个接一个地序列化执行。这可能是您的应用程序中的一大瓶颈。

ASPCompat=true 向 ASP.NET 运行时发出信号,表明您正在使用 STA COM 对象并因此在 STA 线程中运行页面。否则,您可能会遇到异常,或者您的所有 COM 对象将在自动生成的 STA 线程中运行,该线程由对您的页面的所有请求共享(请参阅 MSDN 此处:http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx)

关于.net - COM 互操作 .NET STA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430869/

相关文章:

.net - OxyPlot 无法在 Xamarin Forms UWP 中呈现

.net - 从 System.__ComObject 基类型调用方法

c# - 无法将参数 1 从 'char [25]' 转换为 'SAFEARRAY *'

.net - 为 COM 互操作性注册我的 .net 程序集不会公开我的方法

c# - 在通过 COM 互操作从 C# 读取单元格值期间忽略 excel vba 错误

c# - .NET BCL API 或框架方法的时间复杂度

.net - 这是什么错误? Net.HttpWebRequest.SetAndOrProcessResponse 中的 System.Net.InternalException

c# - 如何最好地并行化网页解析?

c# - 为什么 c# null 可以隐式转换为 System.Nullable<T>,但不能转换为自定义的 Nullable<T>

c# - 从 C# 调用 VB DLL 上的方法