То, когда Вы сказали, "наша кодовая база не предоставляет себя легкому тестированию", является первым знаком запаха кода. Запись Модульных тестов означает типичную запись кода по-другому для создания кода более тестируемым. Это - хорошая вещь, по-моему, как, что я видел за эти годы в записи кода, на который я имел к тестам записи, это вынудило меня выдвинуть лучший дизайн.
Один из методов, которые я использовал в прошлом, заключался в использовании объекта системного мьютекса. Теория, лежащая в основе этого, заключается в том, что первый экземпляр приложения сгенерирует объект мьютекса, а последующие экземпляры приложения затем попытаются открыть дескриптор предопределенного мьютекса, и если он существует, тогда бамо! выйти из второго, третьего и четвертого .... экземпляров.
public static void CheckSingleInstance()
{
bool created = false;
_singleInstance = new Mutex(true, "PredefinedMutexName##1", out created);
if (!created)
{
MessageBox.Show("Another instance of this application is already running. Click OK to switch to that instance.", "Application running", MessageBoxButtons.OK, MessageBoxIcon.Information);
Process proc = Process.GetCurrentProcess();
Process[] procs = Process.GetProcessesByName(proc.ProcessName);
bool exit = false;
Process process = null;
foreach (Process p in procs)
{
if (p.Id != proc.Id && p.MainModule.FileName == proc.MainModule.FileName)
{
// ShowWindow(p.MainWindowHandle, 1/*SW_SHOWNORMAL*/);
process = p;
exit = true;
}
}
if (exit)
{
Application.Exit();
if (process != null)
NativeMethods.SetForegroundWindow(process.MainWindowHandle);
return;
}
}
}
Вопрос не очень ясный. Я понимаю, что вы уже знаете, как ограничить свое приложение только одним экземпляром, и что вы хотите, чтобы несколько экземпляров вашей основной формы выполнялись независимо, но внутри одного процесса, верно? И затем вы ищете лучший способ заставить их общаться?
Для этого я бы создал несколько доменов приложений в вашем процессе. Таким образом вы можете изолировать каждую форму, как если бы она выполнялась в отдельном процессе. Они будут использовать отдельные адресные пространства, их можно останавливать независимо, и код в одном домене не может влиять на код в других доменах (сбои и т. Д.).
Для связи между различными формами / доменами приложений я бы использовал WCF, поскольку это современный способ взаимодействия между процессами, приложениями или между компьютерами в .NET Framework