【发布时间】:2015-04-11 04:03:03
【问题描述】:
我正在尝试将副本复制到我的 .ascx 文件中的剪贴板。由于这是 ASP.NET,所以没有将 [STAThread] 放在上面的 main 函数。
我收到一条错误消息:“在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。”
在我的 ascx.cs 文件中,我有using System.Windows.Forms;,然后是一行代码Clipboard.SetText("Hello, clipboard");
我试图找到一个解决方案,但大多数解决方案都假设有一个主要的,或者说要删除 dll。这些解决方案不适合我的情况。
【问题讨论】:
-
我不是 100% 确定,但仍然有理由确定您不能将 ASP.NET 工作线程更改为 STA。无论如何,一旦线程运行,就无法更改公寓模式。但是你总是可以开始一个新的 STA
Thread;并在你.Start()它之前将其公寓模式设置为STA;并在该线程上执行使用 OLE 的代码。 -
那我该怎么做呢?在我使用
Clipboard.SetText之前,我是否调用了 STAThreadAttribute?在这种情况下,我应该把 .Start() 放在哪里? -
stakx 是我将如何处理这个 STA 问题的方法,我认为我将创建一个新线程。我不确定您如何控制 IIS 进程中的第一个 CoCreate 线程,以便最终获得您。 但是我无法想象在任何情况下我会使用剪贴板在多线程服务应用程序(如 IIS)中的线程之间进行复制。您将有多个线程读取和写入错误的数据。还有许多其他方法可以进行 IPC 进程间通信和同一进程通信,例如缓存对象和指向会话数据库的唯一指针
-
我将代码更改为以下内容:
var thread = new Thread(() => Clipboard.SetText("Hello, clipboard")); thread.SetApartmentState(ApartmentState.STA); thread.Start();并且不再出现错误,但是它没有将文本复制到点击板。 -
您的方法似乎在服务器内部。看看这个问题的答案。它解决了浏览器中的问题。 stackoverflow.com/questions/17527870/…