5/28/2007

Single-Instance Apps

Очень часто на форумах встречается одна и таже тема под разными заголовками, например: "Один экземпляр приложения", "Защита от повторного запуска", "Как определить запущено приложение или нет", "Одна копия приложения ... как лучше".
 
В ответ предлагаются разные решения (на основе Mutex, Semaphore и т.п.), но все они не учитывают "подводные камни", о которых сказано в статье "Stream Decorator, Single-Instance Apps" (MSDN Magazine). 
 
В .NET 2.0 есть стандартное решение (см. Figure 5 Using SingleInstanceApplication):
 
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        SingleInstanceApplication.Run(new Form1(),
            StartupNextInstanceHandler);
    }

    static void StartupNextInstanceHandler(
        object sender, StartupNextInstanceEventArgs e)
    {
        // do whatever you want here with e.CommandLine...
    }
}
Класс SingleInstanceApplication находится в сборке Microsoft.VisualBasic.dll в пространстве имен Microsoft.VisualBasic.ApplicationServices. Правда, эта сборка в C# проекте выглядит необычно, но работает отлично :)
 
 

Перевод текстов и страниц

Google открыла службу перевода текстов. На странице нет ничего лишнего, не то, что на translate.ru :)
Есть возможность "Translate Text" и "Translate a Web Page". Поддерживаются следующие языки:
 
ar|en - Arabic to English BETA; zh|en - Chinese to English BETA; zh-CN|zh-TW - Chinese (Simplified to Traditional) BETA; zh-TW|zh-CN - Chinese (Traditional to Simplified) BETA; en|ar - English to Arabic BETA; en|zh-CN - English to Chinese (Simplified) BETA; en|zh-TW - English to Chinese (Traditional) BETA; en|fr - English to French; en|de - English to German; en|it - English to Italian; en|ja - English to Japanese BETA; en|ko - English to Korean BETA; en|pt - English to Portuguese; en|ru - English to Russian BETA; en|es - English to Spanish; fr|en - French to English; fr|de - French to German; de|en - German to English; de|fr - German to French; it|en - Italian to English; ja|en - Japanese to English BETA; ko|en - Korean to English BETA; pt|en - Portuguese to English; ru|en - Russian to English BETA; es|en - Spanish to English;
 
Пример перевода с английского на русский. Вот оригинал:
 
"While this single-instance application functionality is easily accessible to developers using Visual Basic, the kind folks on the Visual Basic team have implemented this capability in such a way that other languages can also take advantage of it. Here I'll demonstrate how to create single-instance Windows Forms apps in C#. All of the functionality just described is available from the WindowsFormsApplicationBase class as part of the Microsoft.VisualBasic.ApplicationServices namespace in Microsoft.VisualBasic.dll. If you examine in ildasm.exe a single-instance application created with Visual Basic, you'll find a class called MyApplication that derives from WindowsFormsApplicationBase. This class's constructor sets various protected properties on the base class, including one called IsSingleInstance. You can do the same thing in C#."
 
А это перевод:
 
"Хотя это один случай применения функции легко доступны для разработчиков с использованием Visual Basic теплые ребят на Visual Basic группы осуществили этот потенциал таким образом, что можно на других языках также воспользоваться им. Здесь я буду демонстрировать, как создать единый инстанции Windows Forms приложений в C #. Все только что описанные функции можно получить WindowsFormsApplicationBase класс в рамках Microsoft.VisualBasic.ApplicationService ы имен в Microsoft.VisualBasic.dll. Если вы посмотрите в ildasm.exe одного случая применения, созданные с помощью Visual Basic вы найдете класс под названием MyApplication, что вытекает из WindowsFormsApplicationBase. Этот класс в конструктор наборы различных охраняемых объектов, включенных в базовый класс, в том числе организация IsSingleInstance. То же самое можно сделать в C #."
 
Как видно, до совершенства еще далеко :)