【问题标题】:Why STAThread attribute is ignored?为什么 STAThread 属性被忽略?
【发布时间】:2012-05-20 10:53:44
【问题描述】:

vs 奇怪的行为……

大家好!

谁能解释一下,怎么可能?

谢谢, 亚历克斯。

【问题讨论】:

  • 启用非托管代码调试并显示调用堆栈。
  • 请尝试在Main 的开头拨打Thread.CurrentThread.SetApartmentState(ApartmentState.STA)
  • 如果没有效果,请尝试从调试器监视窗口调用它。
  • [STAThread] 只是提示运行时为 COM 对象设置单线程公寓模型(如果 尚未设置)。一旦设置,模型就无法更改。显然,在调用 Main 函数之前正在初始化其他一些组件,这就是已经设置 apratment 模型的原因。

标签: c# .net multithreading sta


【解决方案1】:

我仍然觉得链接的答案有点难以接受,特别是因为 OP 承认他确实没有实际上有一个与 EXE 同名的 DLL。我也无法复制它。

然而,这个解释有一些可信度,我注意到 Fusion 在被要求搜索程序集时会做一些奇怪的事情。您可以在使用 Fuslogvw.exe 时看到这一点,启用“记录所有绑定”选项。奇怪的是,当被要求加载程序集时,它会搜索 both DLL 和 EXE。这是来自测试控制台应用程序的日志条目的 sn-p:

LOG: Attempting download of new URL file:///C:/projects/ConsoleApplication3/bin/Debug/ConsoleApplication3.DLL.
LOG: Attempting download of new URL file:///C:/projects/ConsoleApplication3/bin/Debug/ConsoleApplication3/ConsoleApplication3.DLL.
LOG: Attempting download of new URL file:///C:/projects/ConsoleApplication3/bin/Debug/ConsoleApplication3.EXE.
LOG: Assembly download was successful. Attempting setup of file: C:\projects\ConsoleApplication3\bin\Debug\ConsoleApplication3.exe
LOG: Entering run-from-source setup phase.

向右滚动以查看它首先如何查找 DLL。以及它在与程序集同名的子目录中的外观。 DLL Hell 的奇怪而巨大的潜力在这里。使用 CLR 以某种方式探测 [STAThread] 属性的错误程序集的故障模式。还解释了对 Connect 反馈文章的奇怪“作为外部关闭”驳回,Fusion 归 Microsoft 的 Windows 小组所有,而不是 DevDiv。

Anyhoo,有迹象表明,只需重命名输出文件即可解决您的问题。项目+属性,构建选项卡,输出路径设置。

【讨论】:

    【解决方案2】:

    我不是调试器内部工作的专家,但我会认为监视窗口中显示的值是由 Visual Studio 线程评估的,而不是应用程序的主线程(在屏幕截图中暂停) .

    因此我没有看到矛盾,监视窗口只是说 Visual Studio 线程是 MTA。

    尝试使用Debug.Write 显示主线程的单元状态。

    【讨论】:

    • 确实如此,但在这种情况下并非如此,他使用了断点,因此可以使用执行线程来评估监视表达式。
    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2021-12-03
    • 2021-11-06
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多