从外部应用程序

时间:2016-12-18 01:44:09

标签: c# multithreading

我有以下静态函数导出从外部应用程序调用

[DllExport("Initialize", CallingConvention = CallingConvention.StdCall)] 
public static void OnStartUp1( )
{
    try
    {
        a = new Indicator();
        a.Init();

    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());

    }
}

当我使用并从.NET调用此方法时,另一个应用程序运行良好但是当我从外部应用程序调用它时,我为它构建此函数会返回以下异常:

  

System.InvalidOperationException:DragDrop注册失败。 ---> System.Threading.ThreadStateException:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。确保您的Main函数标记了STAThreadAttribute。

1 个答案:

答案 0 :(得分:1)

你需要匹配同一套公寓。该错误表示必须从具有相同公寓的应用程序(单线程单元或STA)调用它。因此,您的呼叫应用程序必须是STA。 要使其成为STA,您需要main方法上的[STAThread]属性。 这与COM有关。某些COM组件只能由单个线程访问,因此它们托管在STA中。有些是线程安全的,可以通过多个线程访问,因此它们托管在Multi Threaded Apartment(MTA)中。当您调用这些COM组件时,您必须匹配该公寓。 您会注意到Windows窗体应用程序将具有如下主要方法: ///< summary> ///应用程序的主要入口点。 ///< / summary> [STAThread] static void Main() { } 最像.NET应用程序,它正在使用它并且你没有得到那个错误,它的main方法有[STAThread]属性。