如何处理 C# 上的 stathreadattribute 错误?

How can I handle stathreadattribute error on C#?

我编写了以下 C# 代码并从中创建了一个“dll”并在 mql5 中导入到 运行。但是在 运行 之后,当我在对话框中单击 box.I 时遇到了以下我无法解决的错误:

"Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it"

主要的 C# 代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text;
using System.Threading;


namespace mainProg
{
    public static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]

        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form2());
        }
    }
}

在 form2 里面我有:

   private void textBox1_Click(object sender, EventArgs e)
    {

        textBox1.SelectAll();
        Clipboard.SetText(textBox1.Text);
    }

在 MQL5 中我有:

#import "mainProg.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
 Program::Main();
  }

再见,出现这个问题是因为,你在Main中设置了set attribute [STAThread],但是这个Form是由另一个默认初始化为ApartmentState.MTA的线程管理的。

尝试在表单加载时添加此代码:

private void Form2_Load(object sender, EventArgs e)
{
    System.Threading.Thread.CurrentThread.ApartmentState = System.Threading.ApartmentState.STA;
}

应该可以解决你的问题。

编辑

现在我看到 VS 说“System.Threading.Thread.CurrentThread.ApartmentState 已过时”。所以,最好使用:

private void Form2_Load(object sender, EventArgs e)
{
    System.Threading.Thread.CurrentThread.SetApartmentState(System.Threading.ApartmentState.STA);
}