Встраивание ресурсов локализации .DLL в исполняемый файл в C #? - PullRequest
9 голосов
/ 20 сентября 2011

Я хочу сделать мою программу многоязычной. Я успешно сделал программу многоязычной через свойства Localizable и Language. Он сделал несколько файлов .resx. Затем я удалил ненужные файлы, такие как изображения (они одинаковы во всех языках) и т. Д. Из файлов .resx.

Проблема, например, в том, что он также создает папку с именем «en», и в этой папке другой сгенерированный файл называется «ProjectName.resources.dll».

Есть ли способ вставить этот файл ресурсов в .exe? Добавление его к ресурсам и настройка действия сборки на «Встроенный ресурс» также не работает.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 25 февраля 2013

В .NET Framework 4 вы можете встроить библиотеку ресурсов в исполняемый файл.

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

Просто создайте ту же структуру (с локализованными папками 'lib / en', 'lib / de') и вставлять их.

private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
    AssemblyName MissingAssembly = new AssemblyName(args.Name);
    CultureInfo ci = MissingAssembly.CultureInfo;

    ...
    resourceName = "MyApp.lib." + ci.Name.Replace("-","_") + "." + MissingAssembly.Name + ".dll";
    var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)
    ...
}
1 голос
/ 21 февраля 2014

Вы задавали этот вопрос некоторое время назад и уже приняли ответ, но все же я постараюсь предложить альтернативный способ.У меня была та же проблема, и вот как я ее решил:

Я добавил dll как Ressource в мой C # -Проект и добавил этот код в мой Main-Method (тот, который запускает вашу главную winform).

public static void Main(string[] args)
{
    if (InitdeDEDll()) // Create dll if it's missing.
    {
        // Restart the application if the language-package was added
        Application.Restart();
        return;
    }
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new YOURMAINFORM());
}

private static bool InitdeDEDll() // Initialize the German de-DE DLL
{
    try
    {
        // Language of my package. This will be the name of the subfolder.
        string language = "de-DE";
        return TryCreateFileFromRessource(language, @"NAMEOFYOURDLL.dll",
            NAMESPACEOFYOURRESSOURCE.NAMEOFYOURDLLINRESSOURCEFILE);
    }
    catch (Exception)
    {
        return false;
    }
}

private static bool TryCreateFileFromRessource(string subfolder, string fileName, byte[] buffer)
{
    try
    {
        // path of the subfolder
        string subfolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + (subfolder != "" ? @"\" : "") + subfolder;

        // Create subfolder if it doesn't exist
        if (!Directory.Exists(subfolder))
            Directory.CreateDirectory(subfolderPath);


        fileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\" + subfolder + (subfolder!=""?@"\":"") + fileName;
        if (!File.Exists(fileName)) // if the dll doesn't already exist, it has to be created
        {
            // Write dll
            Stream stream = File.Create(fileName);
            stream.Write(buffer, 0, buffer.GetLength(0));
            stream.Close();
        }
        else
        {
            return false;
        }
    }
    catch
    {
        return false;
    }

    return true;
}

}

Примечание: Это создаст папку и language-dll снова, если она отсутствует, поэтому вам больше не нужно заботиться о том, чтобы вы скопировали эту папку и dll сваш exe-файл.Если вы хотите, чтобы он полностью исчез, это, конечно, не будет правильным подходом.

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