我想让我的程序多语言化。我已成功通过Form的Localizable和Language属性使程序多语言化。它制作了一些.resx文件。然后我从.resx文件中删除了不需要的文件,例如图像(它们在所有语言中都是相同的)等。
问题是,例如,它还会生成一个名为“en”的文件夹,在该文件夹中,另一个生成的文件称为“ProjectName.resources.dll”。
无论如何都要将此资源文件嵌入到.exe中吗?将其添加到资源并将Build Action设置为“Embedded Resource”也不起作用。
感谢。
答案 0 :(得分:5)
在.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 :(得分:1)
你刚才问过这个问题并且你已经接受了答案,但我仍然会尝试提供另一种方法。我有同样的问题,这就是我解决它的方法:
我将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。如果你想让它完全消失,那么这当然不是正确的方法。