■80724 / inTopicNo.3) |
Re[1]: 元号対応2 |
□投稿者/ 魔界の仮面弁士 (801回)-(2016/08/05(Fri) 19:59:49)
|
■No80721 (真田昌幸 さん) に返信 > 3.5→4.0 or 4.5はそこまでインパクトは無いように思っていますが、
インパクトという点では、セキュリティルール(CAS など)と 非同期対応(Task クラス)などが大きいところですかね。
今回のケースでは恐らく気にしなくて良いでしょうけれども。
> ちなみに、oleaut32.dll参照は元号に関してはやめるように改修予定です。
それが懸命かと思います。
ちなみに、CLR2 から CLR4 への移行に際しては、 COM の呼び出しに関しても仕様変更があったりします。
[.NET Framework 4 への移行に関する問題] https://msdn.microsoft.com/ja-jp/library/ee941656%28vs.100%29.aspx https://msdn.microsoft.com/en-us/library/ee941656%28vs.100%29.aspx
上記によれば、オートメーションサーバーに対する 『LCID』 パラメーターについて、下記のような変更点が記載されています。
》 CLR はアンマネージ COM ベースのアプリケーションに対する 》 LCID パラメーターに現在のカルチャを渡さなくなりました。 》 代わりに、カルチャとして 1033 (en-us) が渡されます。
》To be consistent with expected behavior 》in automation server settings, 》the CLR no longer passes the current culture 》for the LCID parameter to unmanaged COM-based applications. 》Instead, it passes 1033 (en-us) for the culture.
LCID パラメーターというのは、あまり聞き慣れないかもしれませんが、 Excel のタイプイブラリを見ると、Workbooks.Open や Workbook.Save など、 [in, lcid] long lcid な引数を持つメンバーが多数存在しています。
※この引数は、VBA や VB.NET のオブジェクト ブラウザーでは確認できませんが、 OLE/COM オブジェクト ビューアーで調べることができます。
この LCID の仕様変更が原因で、実行する VB バージョンによって 下記のような差異が生じることになります。
(1) バージョン 2013 の Excel で新規ブックを作成し、 セルA1の表示形式を 分類:通貨 小数点以下の桁数:0 記号:\ 負の数の表示形式:\-1,234(黒) に設定し、それを "C:\TEMP\TestData.xlsx" として保存します。
(2) 下記のコードを、VB2008 および VB2015 にて実行します。 Microsoft.Office.Interop.Excel を参照設定しておいてください。
Module Module1 Sub Main() 'LCID を変更しながら、ファイルを上書き保存していく For Each cultureName In New String() {Nothing, "en-US", "ja-JP", "de-DE"} If cultureName Is Nothing Then cultureName = "Default" Else Thread.CurrentThread.CurrentCulture = New CultureInfo(cultureName) End If
Dim ci As New CultureInfo(cultureName) Thread.CurrentThread.CurrentCulture = ci
'作業前にコピーしておく Dim filePath As String = "C:\TEMP\" & cultureName & ".xlsx" FileCopy("C:\TEMP\TestData.xlsx", filePath)
Dim app As New Excel.Application() app.Visible = True Dim books As Excel.Workbooks = app.Workbooks Dim books As Excel.Workbooks = app.Workbooks Dim book As Excel.Workbook = Nothing Try book = books.Open(filePath) book.Save() book.Close() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.SystemModal) Finally If book IsNot Nothing Then Marshal.ReleaseComObject(book) End If End Try Marshal.ReleaseComObject(books) app.Quit() Marshal.ReleaseComObject(app) Next End Sub End Module
------------ 参照設定に用いる Microsoft.Office.Interop.Excel は バージョン 15.0.0.0 のアセンブリで試してみました。 当方環境では、下記のような結果となります。
【VB2008 .NET 2.0 Console App】
"TestData.xlsx" の書式は、通貨 "\-1,234"(黒) です。無加工。 "Default.xlsx" の書式は、ユーザー定義 "\#,##0;-\#,##0" に変化しました。 "en-US.xlsx" の書式は、通貨 "(\1,234)" に変化しました。 "ja-JP.xlsx" の書式は、ユーザー定義 "\#,##0;-\#,##0" に変化しました。 "de-DE.xlsx" は Workbooks.Open が失敗したため、書式が変更されていません。
【VB2015 .NET 4.6.1 Console App】
"TestData.xlsx" の書式は、通貨 "\-1,234"(黒) です。無加工。 "Default.xlsx" の書式は、通貨 "(\1,234)" に変化しました。 "en-US.xlsx" の書式は、通貨 "(\1,234)" に変化しました。 "ja-JP.xlsx" の書式は、通貨 "(\1,234)" に変化しました。 "de-DE.xlsx" の書式は、通貨 "(\1,234)" に変化しました。エラーにはなりません。
本事象について、下記も参照して見て下さい。 https://social.msdn.microsoft.com/Forums/ja-JP/4e454fcc-93f8-4372-98ac-9a65fb3e38e3/excelexcel?forum=csharpgeneralja
なお、LCID に 1033 (en-us) が渡されるようになったのは、 COM オートメーションに限定した事象のようです。
念のために P/Invoke な呼び出し(Declare または DllImportAttribute)も テストしてみましたが、こちらは CLR2 でも CLR4 でも、 LCIDConversionAttribute での指定に対して Thread.CurrentThread.CurrentCulture.LCID がそのまま渡されており、 1033 (en-us) に変化する事象は確認できませんでした。
|
|