2011-09-20 69 views
8

我想讓我的程序使用多種語言。我已經通過Form的Localizable和Language屬性成功地完成了多語言程序。它製作了一些.resx文件。然後,我從.resx文件中刪除了不需要的文件,例如圖像(它們在所有語言中都是相同的)等。將本地化資源.DLL嵌入到C#中的可執行文件?

問題是,例如,它也會生成一個名爲「en」的文件夾,並且在該文件夾中,另一個生成的文件被稱爲「ProjectName.resources.dll」。

無論如何要嵌入此資源文件的.exe?將它添加到資源並將生成操作設置爲「Embedded Resource」也不起作用。

謝謝。

+0

http://stackoverflow.com/questions/1453755/how-to-embed-a-satellite-assembly-into-the-exe-file –

+0

我試圖ILMerge已經張貼在此之前。試過Assembly Linker,但無法使其工作。由於引用csc.exe給出了一些錯誤,似乎彙編鏈接器導致可執行文件不使用資源DLL。 – PythEch

+0

我不明白MS爲什麼要重新發明輪子... – PythEch

回答

5

在.NET Framework 4中,您可以將資源庫嵌入到可執行文件中。

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

只需創建相同的結構(與本地化的文件夾 '的lib/EN', 'LIB /德'),並把它們嵌入。

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

當我與DLL資源添加本地化的文件夾中,我得到的錯誤「資源名稱「MyApp.MyApp.resources.dll」不能多次使用了。 如果我現在從項目中排除我的resx文件,我不再得到這個錯誤,但我現在得到另一個錯誤:「TranslatedStrings不是資源的成員」。 我的resx文件被稱爲「TranslatedStrings.resx」,「TranslatedStrings.it.resx」等。 – JohnRDOrazio

1

你問這個問題前一段時間,你已經接受了答案,但我仍然會嘗試以另一種方式。我有同樣的問題,這是我如何解決它:

我將dll作爲一個資源添加到我的C#項目,並將此代碼添加到我的主要方法(啓動您的主要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!=""[email protected]"\":"") + 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,如果它丟失,所以你不必關心嗎,你將該文件夾複製,並與您的exe文件的DLL 。如果你希望它完全消失,當然這不是正確的做法。