将本地化资源.DLL嵌入到C#中的可执行文件中?

我想让我的程序多语言。 我已成功通过Form的Localizable和Language属性使程序多语言化。 它制作了一些.resx文件。 然后我从.resx文件中删除了不需要的文件,例如图像(它们在所有语言中都是相同的)等。

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

反正有没有将此资源文件嵌入.exe? 将其添加到资源并将“构建操作”设置为“嵌入式资源”也不起作用。

谢谢。

在.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作为Ressource添加到我的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; } 

}

注意:如果缺少文件夹和language-dll,这将再次创建文件夹和语言-dll,因此您不必再关心使用exe文件复制该文件夹和dll。 如果你想让它完全消失,那么这当然不是正确的方法。