我有一个外部组件(C++),我想从我的C#代码中调用它。
代码大致如下:
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace dgTEST
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ExtComponentCaller extCompCaller = new ExtComponentCaller();
result = extCompCaller.Call(input);
Thread t = new Thread(new ThreadStart(() =>
{
try
{
result = extCompCaller.Call(input);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
}
}
问题在于第一次调用时它能够正常工作,外部组件被调用并返回结果。但是当我尝试在另一个线程中调用它时,就会出现异常:System.InvalidCastException: 无法将类型为 'System.__ComObject' 的COM对象强制转换为... 。我确定这个异常是由STAThread引起的。因为如果我从Main函数中删除[STAThread]属性,第一次调用该外部组件时也会出现相同的问题,而这次调用之前一切都很顺利。 我该如何在其他线程中调用此外部组件以摆脱这个异常?
更新 ----------------------------
现在发生了另一件疯狂的事情。 当我使用F5从Visual Studio启动程序时,第一个调用也会出现问题,但是当我直接执行二进制.exe文件时,它可以正常工作(从另一个线程中则不行 :( )。 如果我将构建从Debug切换到Release并从Visual Studio使用F5启动,则第一个调用再次正常工作。
这是为什么呢?谢谢您的帮助!