System.Activator.CreateInstance и потоки

Я вызываю внешнее приложение, которое превращает XML в PDF.

dynamic generator = null;
Assembly a = Assembly.LoadFrom(file);
Type type = a.GetType("Application.ConsoleStartup.Program");
generator = Activator.CreateInstance(type);

а потом

generator.Run("testXML.xml");  

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

Ошибка выглядит так:

error DCP999: [System.InvalidOperationException] The calling thread must be STA, because many UI components require this.
   at System.Windows.Input.InputManager..ctor()
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
   at System.Windows.Input.InputManager.get_Current()
   at System.Windows.Input.KeyboardNavigation..ctor()
   at System.Windows.FrameworkElement.FrameworkServices..ctor()
   at System.Windows.FrameworkElement.EnsureFrameworkServices()
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Control..ctor()
   at System.Windows.Controls.ContentControl..ctor()
   at System.Windows.Controls.ToolTip..ctor()
   at Application.Parser.Html.Model.Anchor.AfterInsert(IParseContext pc) in C:\work\Common\Main\Source\Parsers\HtmlParser\Model\Anchor.cs:line 31

3 ответа

Решение

Почему бы не использовать: System.Diagnostics.Process?

Process myProcess = new Process();
myProcess.StartInfo.FileName = file; 
myProcess.Start();

Вы должны добавить следующее к вашему main способ применения:

[STAThread]
static void Main(string[] args)
{
    // ...

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

Нового приложения нет, вы загружаете сборку в собственное приложение. Вы можете изменить модель квартиры вашей темы, используя Thread.SetApartmentState: http://msdn.microsoft.com/en-GB/library/system.threading.thread.setapartmentstate.aspx

Другие вопросы по тегам