KYO'S BLOG

<< July 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

This system does not contain support for the Japanese locale.

0
    Microsoft.VisualBasic.Strings.StrConv
    なんぞを使用すると、「This system does not contain support for the Japanese locale.」なるエラーが。
    どうやら英語OSを使用している様子。
    下記の情報が関係しそうだけど、.NET Framework 1.1 の Language Pack 入れたけど・・・直らんかったorz

    http://msdn2.microsoft.com/ja-jp/library/microsoft.visualbasic.strings.strconv(vs.80).aspx

    対応外のロケールで定数 VbStrConv.Wide、VbStrConv.Narrow、VbStrConv.SimplifiedChinese、VbStrConv.TraditionalChinese、VbStrConv.Katakana、および VbStrConv.Hiragana を使用するとランタイム エラーが発生する場合がありますが、定数 VbStrConv.Katakana および VbStrConv.Hiragana は、日本語 Language Pack をインストールすると日本語以外のシステムでも使用できます。また、定数 VbStrConv.Wide および VbStrConv.Narrow の使用は、東アジア言語がインストールされているすべてのシステムでサポートされています。



    C# | permalink | comments(5) | -

    throw e; は間違い?

    0
      C# .NET での例外についてだけど、例外をキャッチして、条件判断後、再度 throw する時の良くある間違い。

      } catch (Exception e) {
        if (e.Messege == "適当な判断式") return;
        // 判断の結果、そのまま例外を投げたい場合
        ○ throw;
        × throw e;
      }

      ×の方を行うと、ここから例外の基点となるので、InnerException も、StackTrace も消えちゃう感じ。
      その状態で最上位の global.asax なりでログ出力しても、InnerException を探しても何も無くて終わり。

      これって .NET エンジニアならみんな常識なのでしょうか?
      非常に重要な気がするが、例外のヘルプとかにも良く探さないと見つからない。
      確かに「開発技術大全」とかにも、さらっとこのことについて触れてくれてはいるけど。
      まぁ、.NETer はこのバイブルを読め!ってことなのかなwww

      しかし、throw e; と明示的に指定したいときってどういうシチュエーションの時なんだろう???
      ということで、至る所に存在する throw e; やら throw ex; やらを何とかせねば・・・

      なんでこういうデザインになったのか知りたいものです。
      ↓ちょっと微妙・・・な説明・・・最善の方法って(汗

      【参考資料】
      http://msdn2.microsoft.com/ja-jp/library/ms229005(VS.80).aspx
      例外をキャッチして再スローする場合は、空の throw を使用してください。例外呼び出し履歴を保持するには、これが最善の方法です。
      例外をキャッチし、キャッチした例外を再スローするときに正しく指定しないコード例を次に示します。これにより、スタック トレースは、エラー位置として、DoWork メソッドをポイントする代わりに再スローをポイントします。
      C# | permalink | comments(0) | -

      VbStrConv.Wide and VbStrConv.Narrow are not applicable to the locale specified

      0
        .NET ランタイムエラーで、こんなん出ましたけど・・・orz

        "VbStrConv.Wide and VbStrConv.Narrow are not applicable to the locale specified"

        http://msdn2.microsoft.com/en-us/library/13e5zk67.aspx
        Remove either VbStrConv.Wide or VbStrConv.Narrow.

        えっと・・・使うなって orz
        いやいや、今まで使っていたし、今も本番環境じゃ使っているし。
        まぁ、こんな強引に使うのがいけないんだろうけどw

        と言うことで、調査しても分からんからぁ〜
        再インストール!!
        治った!
        これでいいのだw

        なんて書くとみんなに蹴りでも入れられそうだな。
        でも、現場的には、こんなことで時間とられている場合じゃないんだよ。
        と言い訳w
        C# | permalink | comments(2) | trackbacks(0)

        C#でZIP圧縮

        0
          @ITに
          [ASP.NET]動的に圧縮ファイルを生成するには?
          という記事があがっている。VJのLibraryでZip圧縮するというもの。
          たぶん日本語ファイル名に対応できてないんじゃないかなぁ?と思う。

          このあたりは以前検証したので結果を載せておこう。
          すでに BLOG に載せたと思ったのだが、載せてなかった・・・


          1. J#.Net のライブラリを使用する。
           http://msdn.microsoft.com/msdnmag/issues/03/06/ZipCompression/default.aspx
           J# で用意されているクラスを使用する。
           Java では Zip 圧縮が提供されているので.Net では J# のみ用意されている様子。

           メリット  : .Net Framework 標準で準備されている。
           デメリット : 日本語ファイル名に対応できていない。.Net Framework 2.0 で対応されるような記述はある。


          2. SharpZipLib (オープンソース) を使用する。
           http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx
           上記 1 の Microsoft のドキュメント内で紹介されている圧縮機能の代替案。

           メリット  : オープンソースなので修正が可能。
           デメリット : 日本語ファイル名対応済み(?)。Microsoft が保障しているわけではない。
           検証結果  : 日本語ファイル名でも対応可能。


          3. unzip32.dll を使用する。
           http://www.csdinc.co.jp/archiver/lib/unzip32.html
           Win32 を使用した外部 dll を使用した方法。

           メリット  : C++ や VB などでは広く使われていると思われる(推測)。
                  利用できる関数も多種用意されている。日本語対応されている。
           デメリット : Free のライブラリの信頼性評価が難しい。COM アクセスになる。
           検証結果  : ASP.NET から dll ライブラリを使用することは可能であることを確認。
                  テストベースでは WEB から日本語ファイルでの圧縮解凍ができている。

          C# | permalink | comments(2) | trackbacks(0)

          C# から Excel にマクロを追加する。

          0
            03872 [HOWTO] Visual C# .NET からオートメーションを使用して Excel マクロを作成する方法
            をちょっと改造。
            まぁ、メモってことで。

            特に上記 MSKB のサンプルでは Excel ブックの新規作成なので、下記は既存のファイルを開いて
            マクロを追加するようにしている。
            そのまま使用すると、Excel のプロセスが解放されなかったので、その辺も注意する必要がある。
            MSKB のサンプルがちゃんと解放してくれるかは試してないが、なんとなく同じ理由で解放してく
            れないのではないかと思う。


            ==============================================================
            private void AddExcelMacro(string fn)
            {

             Excel.Application oExcel = null;
             Excel.Workbook oBook   = null;
             Excel.Workbooks oBooks  = null;
             VBComponent oModule   = null;
             String sCode;
             Object oMissing = System.Reflection.Missing.Value;

             try
             {
              // Excel のインスタンスを作成します。
              oExcel = new Microsoft.Office.Interop.Excel.Application();

              // ブックを追加します。
              oBooks = oExcel.Workbooks;
              oBook = oBooks.Open(fn,Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                          Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                          Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                          Type.Missing, Type.Missing);

              // WorkBooks を使用せずに開くと解放しても Excel プロセスが残ってしまう。
              // oBook = oExcel.Workbooks.Open(fn,Type.Missing, Type.Missing, Type.Missing, Type.Missing,
              //                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,
              //                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,
              //                 Type.Missing, Type.Missing);

              // 新しい VBA コード モジュールを作成します。
              oModule = oBook.VBProject.VBComponents.Item("ThisWorkBook");
             
              // macro.template ファイルにマクロを書いたテキスト文書があるので読み込む
              StreamReader sr = new StreamReader(Server.MapPath(".") + "/macro.template", SJIS);
              sCode = sr.ReadToEnd();
              sr.Close();

              // 新しいコード モジュールに VBA マクロを追加します。
              oModule.CodeModule.AddFromString(sCode);

              // 保存して閉じる
              oBook.Save();
              oExcel.Quit();


             }
             catch (Exception ex)
             {
              throw ex;
             }
             finally
             {

              // 解放します。
              System.Runtime.InteropServices.Marshal.ReleaseComObject(oModule);
              System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
              System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
              System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
              
              // 上記で解放しているが念のため null 設定しておく。
              oModule = null;
              oBook  = null;
              oBooks = null;
              oExcel = null;

              // ガーベジ コレクションを実行します。
              GC.Collect();
             }
            }

            C# | permalink | comments(0) | trackbacks(0)