希望在这里解决争论。
我使用从ASP.NET页面在VB中创建的COM对象阅读的所有内容都围绕着
警告 - 请确保您使用ASPCOMPAT或无法使用
然而......我已经设定了这个并且猜测是什么 - 没有问题。
现在,我读了这个
http://msdn.microsoft.com/en-us/library/zwk9h2kb.aspx
和
http://blogs.claritycon.com/blogs/don_peterson/archive/2008/01/17/3621.aspx
这表明你不会得到例外,它不会很好。
任何人都可以对正在发生的事情作出明确答复吗?
另外,如果有任何方法我可以在MTA和STA之间进行切换(通过一些调试器魔术 - 甚至看看汇编程序!)我将不胜感激。
干杯 邓肯
答案 0 :(得分:4)
当然,您可以在ASP.NET应用程序中使用VB COM组件。你认为数百万行VB代码不会在.NET-land中获得任何的爱? :)
VB COM组件因使用单线程单元(STA)编译而臭名昭着 - 尽管并非总是如此(如果我没记错的话)。
在.NET中使用STA VB组件时,您可能会遇到以下情况:
确定线程的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,假设你有一个测试环境。
在组件中调用睡眠一段时间,比如30秒,然后部署组件。
启动几个浏览器并在同一时间点击需要两个浏览器组件的页面。
假设页面没有其他重要的非确定性延迟,您应该能够判断这是否是MTA或STA。如果两个页面同时返回(大约30秒后),则该组件将作为MTA运行。如果一个在30中返回而另一个在60中返回,则它作为STA运行。
我认为有一种方法可以检查注册表或dll本身,但是自从我在混合的COM / ASP.NET世界中工作以来已经有一段时间了。
祝你好运!