14 Stimmen

Einbetten von Lokalisierungsressourcen .DLL's in die ausführbare Datei in C#?

Ich möchte mein Programm mehrsprachig gestalten. Ich habe das Programm erfolgreich über die Eigenschaften Lokalisierbar und Sprache des Formulars mehrsprachig gemacht. Es wurden einige .resx-Dateien erstellt. Dann habe ich nicht benötigte Dateien wie Bilder (die in allen Sprachen gleich sind) usw. aus den .resx-Dateien gelöscht.

Das Problem ist, dass zum Beispiel auch ein Ordner mit dem Namen "en" erstellt wird und in diesem Ordner eine weitere Datei mit dem Namen "Projektname.resources.dll".

Gibt es eine Möglichkeit, diese Ressourcendatei in die .exe einzubetten? Das Hinzufügen zu den Ressourcen und die Einstellung von Build Action auf "Embedded Resource" funktioniert auch nicht.

Merci.

7voto

IvanP Punkte 263

In .NET Framework 4 können Sie eine Ressourcenbibliothek in eine ausführbare Datei einbetten.

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

Erstellen Sie einfach dieselbe Struktur (mit lokalisierten Ordnern 'lib/en', 'lib/de') und betten Sie sie ein.

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)
    ...
}

2voto

Mickey Punkte 943

Sie haben diese Frage schon vor einiger Zeit gestellt und bereits eine Antwort akzeptiert, aber ich werde trotzdem versuchen, einen alternativen Weg aufzuzeigen. Ich hatte das gleiche Problem und habe es folgendermaßen gelöst:

Ich fügte die Dll als Ressource zu meinem C#-Projekt hinzu und fügte diesen Code zu meiner Main-Methode (die eine, die Ihr Haupt winform startet).

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;
}

}

Hinweis: Dadurch werden der Ordner und die Sprach-Dll wieder erstellt, wenn sie fehlen, so dass Sie sich nicht mehr darum kümmern müssen, dass Sie den Ordner und die Dll mit Ihrer Exe-Datei kopieren. Wenn Sie wollen, dass sie komplett verschwindet, ist das natürlich nicht der richtige Ansatz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X