如何处理 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);
}
我编写了以下 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);
}