ASP.NET和STA COM对象

时间:2009-08-27 16:17:51

标签: asp.net com

希望在这里解决争论。

我使用从ASP.NET页面在VB中创建的COM对象阅读的所有内容都围绕着

警告 - 请确保您使用ASPCOMPAT或无法使用

http://books.google.co.uk/books?id=-sjg09Crh40C&lpg=PA771&ots=g-vqDun9TR&dq=asp.net%20c%23%20sta&pg=PA771#v=onepage&q=&f=false

然而......我已经设定了这个并且猜测是什么 - 没有问题。

现在,我读了这个

http://msdn.microsoft.com/en-us/library/zwk9h2kb.aspx

http://blogs.claritycon.com/blogs/don_peterson/archive/2008/01/17/3621.aspx

这表明你不会得到例外,它不会很好。

任何人都可以对正在发生的事情作出明确答复吗?

另外,如果有任何方法我可以在MTA和STA之间进行切换(通过一些调试器魔术 - 甚至看看汇编程序!)我将不胜感激。

干杯 邓肯

2 个答案:

答案 0 :(得分:4)

当然,您可以在ASP.NET应用程序中使用VB COM组件。你认为数百万行VB代码不会在.NET-land中获得任何的爱? :)

VB COM组件因使用单线程单元(STA)编译而臭名昭着 - 尽管并非总是如此(如果我没记错的话)。

在.NET中使用STA VB组件时,您可能会遇到以下情况:

  1. 表现较差
  2. 由于终结器被阻挡而可能导致内存泄漏(并不是所有的悲观和沮丧,似乎经常发生这种情况)
  3. 脱发
  4. 确定线程的MTA v.STA的简单方法是利用Windbg,连接到进程,加载SOS和执行!线程。你会看到类似的输出:

    0:015> !threads
    ThreadCount: 27
    UnstartedThread: 0
    BackgroundThread: 17
    PendingThread: 0
    DeadThread: 10
    Hosted Runtime: no
                                          PreEmptive   GC Alloc           Lock
           ID OSID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
      15    1  a28 000d75f0   1808220 Enabled  3823b58c:3823bb08 000d3fe8     0 STA (Threadpool Worker)
      19    2  43c 000dd5f0      b220 Enabled  00000000:00000000 000d3fe8     0 MTA (Finalizer)
      20    3  b94 000f20b0    80a220 Enabled  00000000:00000000 000d3fe8     0 MTA (Threadpool Completion Port)
      21    4  15c 000f5318      1220 Enabled  00000000:00000000 000d3fe8     0 Ukn
    

    请注意,其中一个主题在APT列中列出“STA”。这个线程是一个STA线程,您可能会在其调用堆栈上看到您的VB COM代码。

    讨论问题的参考文献:

    祝你好运!
    ž

答案 1 :(得分:1)

如果你可以修改COM对象的来源,你可以通过一个简单的实验来确定它是否表现为STA,假设你有一个测试环境。

  1. 在组件中调用睡眠一段时间,比如30秒,然后部署组件。

  2. 启动几个浏览器并在同一时间点击需要两个浏览器组件的页面。

  3. 假设页面没有其他重要的非确定性延迟,您应该能够判断这是否是MTA或STA。如果两个页面同时返回(大约30秒后),则该组件将作为MTA运行。如果一个在30中返回而另一个在60中返回,则它作为STA运行。

  4. 我认为有一种方法可以检查注册表或dll本身,但是自从我在混合的COM / ASP.NET世界中工作以来已经有一段时间了。

    祝你好运!