在c#中嵌入本地化资源.dll 's到可执行文件

本文关键字:可执行文件 dll 资源 本地化 | 更新日期: 2023-09-27 18:09:03

我想让我的程序多语言。我已经成功地通过表单的可本地化和语言属性使程序多语言。它生成了一些.resx文件。然后我从。resx文件中删除了不需要的文件,如图像(在所有语言中都是相同的)等。

问题是,例如,它还生成一个名为"en"的文件夹,在该文件夹中,另一个生成的文件称为"ProjectName.resources.dll"。

是否有办法嵌入这个资源文件到。exe?将其添加到资源中并将构建操作设置为"嵌入式资源"也不起作用。

谢谢。

在c#中嵌入本地化资源.dll 's到可执行文件

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

您之前已经问过这个问题,并且您已经接受了一个答案,但是我仍然会尝试提供另一种方法。我有同样的问题,我是这样解决的:

我将dll作为资源添加到我的c# -Project中,并将此代码添加到我的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;
}

}

注意:这将再次创建文件夹和语言dll如果它丢失了,所以你不必再关心你复制该文件夹和dll与你的exe文件。如果你想让它完全消失,这当然不是正确的方法。