3

.NET コンパクト フレームワーク 3.5 と MS Visual Studio 2008 を使用して、モバイル デバイス (Windows CE 5.0、.NET コンパクト フレームワーク 2.0 プリインストール) 用のアプリケーションを開発しています。

ローカライズされたフォームを作成するための組み込みオプションを使用しています。これは、デスクトップ コンピューターに接続されたモバイル デバイスで Visual Studio のデバッグ機能を使用する限り、完全に機能します。この場合、Visual Studio はアプリケーションを .NET Compact Framework 3.5 と共にデプロイします。モバイル デバイスを切断し、アプリケーションをインストールした後も、期待どおりに動作しています。

私の問題は次のとおりです。Microsoft が提供する CAB ファイルを使用して .NET コンパクト フレームワークをインストールし、デバッガーを使用せずに (Visual Studio によって作成された CAB ファイルを使用して) アプリケーションをインストールすると、アプリケーションは同様に機能しますが、ローカリゼーションは行われません。したがって、Visual Studio の展開機能を使用してのみインストールされ、.net にロケールを認識させる .NET フレームワークの一部が必要だと思います。- これらがどのパーツ (ライブラリ...?) か知っている人はいますか? アプリケーションは Visual Studio を使用しないユーザーに提供されるため、これに対する解決策を見つけなければなりません。

4

2 に答える 2

0

答えは簡単です。それはうまくいくはずです。しかし、そうではありません。

Visual Studio が CAB ファイルを生成するために使用する Microsoft のツール CABWiz には明らかにバグがあります。ローカリゼーションを使用する場合のように、異なるサブフォルダーで同じ名前のファイルを使用する場合に問題があります。

何時間も修正を試みた後、前の回答でコーネルによって提供された CodeProject ガイドに触発されたソリューションにたどり着きました。一意の名前のリソース ファイルを使用して、CAB を生成する Visual Studio プロセスを「ハック」する必要があります。次に、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);
                }
            }
        }

そして、通常の CAB 生成後のこの CAB パッチャー:

    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 + ") !");
    }

お役に立てば幸いです。

これに関するその他のリンク:

于 2014-11-25T08:14:33.370 に答える
0

コンパクト フレームワークを使用してリソースのローカリゼーションを行うためのチュートリアル - ガイドを使用しました: http://www.codeproject.com/Articles/28234/Survival-guide-to-do-resource-localization-using-C

于 2013-10-20T19:32:05.050 に答える