2013-08-21 4 views
3

Я занимаюсь разработкой приложений для мобильных устройств (Windows CE 5.0, .NET компактный framwork 2,0 предустановленная) с использованием .NET Compact Framework 3.5 и MS Visual Studio 2008.локализация с .net Compact Framework

Я m, используя встроенную опцию для создания локализованных форм. Это работает отлично, пока я использую функцию отладки Visual Studio с мобильным устройством, подключенным к моему настольному компьютеру. В этом случае Visual Studio развертывает мое приложение вместе с .NET compact framework 3.5. После отключения мобильного устройства и установки моего приложения он работает по-прежнему.

Моя проблема: если я устанавливаю платформу .NET compact с помощью файла CAB, предоставленного Microsoft, а затем устанавливаю мое приложение (также используя файл CAB, созданный Visual Studio), не используя отладчик, приложение также работает но без локализации. Поэтому я думаю, что должны быть некоторые части платформы .NET, которые устанавливаются только с помощью функции развертывания Visual Studio, и которые делают .net распознающим локаль. - Кто-нибудь знает, какие части (библиотеки ...?)? Поскольку приложение будет предоставляться пользователям, которые не будут использовать Visual Studio, я должен найти решение для этого.

+1

Вы убедились, что файл CAB фактически устанавливает свои локализованные сборки ресурсов? –

+0

В CF отсутствует «локализация». Вероятно, вы не будете развертывать локализованные ресурсы с помощью CAB, или вы развертываете их в неправильном месте. – ctacke

ответ

0

Ответ прост. Он должен работать. Но это не так.

Существует явная ошибка в инструменте Microsoft CABWiz, используемом Visual Studio для генерации файлов CAB. Это проблема при использовании файлов с одинаковым именем в разных подпапках, например, при использовании локализации.

После того, как мы попытались исправить это, я решил, что решение, основанное на the CodeProject guide, было дано Cornel в предыдущем ответе: вы должны «взломать» процесс Visual Studio генерации CAB, используя файлы ресурсов с уникальными имя, а затем изменение INF-файла, чтобы указать исходное имя для развертывания на устройстве.

Чтобы автоматизирует немного больше, я сделал небольшую EXE, которая запускается в качестве проекта после сборки:

 FileInfo CurrentExeInfo = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location); 

     // Current Folder + bin\Debug 
     DirectoryInfo BinDebug = new DirectoryInfo(Path.Combine(CurrentExeInfo.Directory.FullName, @"bin\Debug")); 

     // Subfolders in \bin\Debug 
     Console.WriteLine(BinDebug.FullName); 
     string[] Dirs = Directory.GetDirectories(BinDebug.FullName, "*", SearchOption.TopDirectoryOnly); 

     // In each localization folder ... 
     foreach (string Dir in Dirs) 
     { 
      DirectoryInfo DirInfo = new DirectoryInfo(Dir); 

      // ... Resource files 
      string[] RFiles = Directory.GetFiles(Dir, "*.resources.dll"); 

      foreach (string RFile in RFiles) 
      { 
       FileInfo RFileInfo = new FileInfo(RFile); 
       bool DoCopy = false; 

       // No underscore in resource name 
       if (!RFileInfo.Name.Contains("_") || RFileInfo.Name.IndexOf("_") == 0) 
       { 
        DoCopy = true; 
       } 
       // underscore in resource name 
       // --> Have to check if already a copy 
       else 
       { 
        // prefix removal 
        int PrefixIndex = RFileInfo.Name.IndexOf("_"); 
        string TestFilename = RFileInfo.Name.Substring(PrefixIndex + 1); 

        if (!File.Exists(Path.Combine(Dir, TestFilename))) 
        { 
         // File without underscore does not exist, so must copy 
         DoCopy = true; 
        } 
       } 

       if (DoCopy) 
       { 
        // Copy file 
        string NewFileName = Path.Combine(Dir, DirInfo.Name.ToUpper() + "_" + RFileInfo.Name); 
        Console.WriteLine("Copying " + RFile + " -> " + NewFileName); 
        File.Copy(RFile, NewFileName, true); 
       } 
      } 
     } 

А потом этот САВ патчер после нормального поколения САВ:

const string cabwizpath = @"C:\Program Files (x86)\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe"; 

    static void Main(string[] args) 
    { 
     if (args.Length == 0) 
     { 
      Console.WriteLine("Aborted: You must enter the inf file information"); 
      Console.ReadLine(); 
      return; 
     } 
     if (!File.Exists(args[0])) 
     { 
      Console.WriteLine("Aborted: I can not found the INF file!"); 
      Console.ReadLine(); 
      return; 
     } 

     // string to search 
     Regex R = new Regex("\"[A-Z]{2,3}_(.+)\\.resources\\.dll\",\"([A-Z]{2,3})_(.+)\\.resources\\.dll\""); 

     // File reading 
     string inffile = File.ReadAllText(args[0]); 

     // Format replace from 
     // "FR_ProjectName.resources.dll","FR_ProjectName.resources.dll" 
     // To 
     // "ProjectName.resources.dll","FR_ProjectName.resources.dll" 
     inffile = R.Replace(inffile, "\"$1.resources.dll\",\"$2_$3.resources.dll\""); 

     // Rewriting file 
     File.WriteAllText(args[0], inffile); 
     Console.WriteLine("INF file patched ..."); 

     // Génération du CAB ... 
     Console.WriteLine("Generating correct CAB ... "); 
     System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo("\"" + cabwizpath + "\"", "\"" + args[0] + "\""); 
     proc.ErrorDialog = true; 
     proc.UseShellExecute = false; 
     proc.RedirectStandardOutput = true; 
     Process CabWiz = Process.Start(proc); 
     Console.WriteLine("\""+cabwizpath + "\" \""+ args[0]+"\""); 
     CabWiz.WaitForExit(); 
     Console.WriteLine("CAB file generated (" + CabWiz.ExitCode + ") !"); 
    } 

Я надеюсь, помогает.

Больше ссылки по этому поводу:

Смежные вопросы