Мне нужно перезапустить приложение .NET WPF из автоматизации VB6 COM с помощью CreateObject () - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть работающее приложение, в котором мне пришлось заменить COM-сервер VB6 на .NET в C #.Он создается клиентом VB6 с использованием CreateObject () ProgID и CLSID через regitry.Интерфейс автоматизации поддерживается и все прекрасно работает с обменом данными между VB6 и C # .NET.

Моя проблема в том, что мне нужно перезапустить приложение, написанное на C # .NET, и оно не будет перезапущено после завершения работы.Перезапуск работает со старой записанной версией VB6.

В коде VB6 он отключит сервер, назначив интерфейсу и объекту 'Nothing'.т.е. MySvrObj.AutoIntFce = Nothing т.е. MySvrObj = Nothing.

Чтобы завершить работу моего сервера C # .NET, мне пришлось заменить «= Nothing» на метод интерфейса автоматизации, который в конечном итоге вызвал бы Automation.Current.Shutdown ().Это все работает, и приложение будет закрыто.Моя проблема в том, что я не могу перезапустить Сервер после его выключения.

Первоначально я начал преследовать ошибку «Невозможно создать более одного экземпляра System.Windows.Application в одном домене приложений».Из приведенного ниже кода это происходит в строке «app = new App ()».

       //Thread to start Application
        Thread UIThread = new Thread(() =>
        {
            app = new App();
            app.InitializeComponent();

            System.Windows.Application.Current.Run();
        }
        );

        UIThread.SetApartmentState(ApartmentState.STA);
        UIThread.Start();//Start application run thread

        while (System.Windows.Application.Current == null)
        {
            Thread.Sleep(300);
        }           
        return;

Я попытался повторно запустить существующее приложение в том же потоке, но когда я попадаю на строку System.Windows.Application.Current.Run (), «Current» является нулевым.Затем я попытался выполнить app.Run (), и сообщение «Cannot Run Multiple Items»

Я чувствую, что у меня нет ручки для основной проблемы, которая заставляет меня преследовать свой хвост.Любое объяснение или решение моей проблемы было бы очень полезно.Заранее спасибо

Вот процесс завершения работы VB, который использует часть интерфейса .NET (IDotNet), а также назначает "= Nothing" интерфейсу, который нормально завершит работу старого сервера VB6.Старое приложение VB6 также создавало тот же процесс Excel.

Friend Sub Shutdown()

On Error GoTo ErrorHandler

Dim ShutDownDotNet As IDotNet

If Not (mimMaint Is Nothing) Then
    Set ShutDownDotNet = mimMaint.DotNet
    ShutDownDotNet.QuitDotNet
    If Not (mimMaint.Job Is Nothing) Then
        Set mimMaint.Job.ProgressClient = Nothing
        Set mimMaint = Nothing
        If Not (mimtToolbar Is Nothing) Then
            mimtToolbar.GetButton("Maintenance").Enabled = False
        End If
        mblnAvail = False
    End If
End If

Exit Sub

ErrorHandler:
   If Err.Number = 462 Then
     Resume Next
   Else
     gmcMessaging.ReportError "Maintenance::Shutdown", Err.Number, Err.Description
     Resume Next
   End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...