У меня есть работающее приложение, в котором мне пришлось заменить 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