2016-12-18 3 views
0

я следующую статическую функцию экспорта для вызова из внешнего приложенияВызов статического метода из внешнего приложения

[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: текущий поток должен быть установлен в режим однопоточной квартиры (STA) до того, как вызовы OLE могут быть сделаны. Убедитесь, что ваша основная функция имеет STAThreadAttribute, отмеченный на нем.

+0

Пробовал ли вы пометить метод атрибутом [STAThread]? –

ответ

1

Вы должны соответствовать той же квартире. Ошибка указывает на то, что она должна быть вызвана из приложения с той же квартирой (отдельная квартира с резьбой или STA). Поэтому ваше вызывающее приложение должно быть STA.

Чтобы сделать это STA, вам нужен атрибут [STAThread] по вашему основному методу.

Это связано с COM. Некоторые COM-компоненты могут быть доступны только одним потоком, поэтому они размещаются в STA. Некоторые из них сделаны потокобезопасными и доступны несколькими потоками, поэтому они размещаются в Multi Threaded Apartment (MTA). Когда вы вызываете эти COM-компоненты, вы должны соответствовать этой квартире.

Вы заметите окна формы приложения будут иметь основной метод, как это:

/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
} 

Большинство как приложение .NET, с которой он работает, и вы не получите эту ошибку, имеет этот [STAThread] атрибут его основной метод.

+0

У меня нет основной процедуры, но я использовал это – esalem

+0

Thread.CurrentThread.SetApartmentState (ApartmentState.STA); и он решает сообщение, но форма, которая работает, недоступна – esalem

+0

Это как замороженная форма. – esalem

Смежные вопросы