<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Programming</title><link>http://blogs.wankuma.com/tyappi/category/1073.aspx</link><description>いろんなの</description><managingEditor>ちゃっぴ (tyappi@wankuma.com)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>.Net Framework で作成した Windows Service Installer に独自の設定を追加する方法</title><link>http://blogs.wankuma.com/tyappi/archive/2010/09/23/193165.aspx</link><pubDate>Thu, 23 Sep 2010 17:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/09/23/193165.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/193165.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/09/23/193165.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/193165.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/193165.aspx</trackback:ping><description>&lt;P&gt;.NET Framework を利用して作成した Windows Service を install する場合、&lt;A href="http://msdn.microsoft.com/ja-jp/library/50614e95.aspx"&gt;installutil.exe&lt;/A&gt; を利用して install します。&lt;/P&gt; &lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/sd8zc8ha.aspx"&gt;方法 : サービスをインストールおよびアンインストールする&lt;/A&gt;&lt;/P&gt; &lt;P&gt;Install 時に行う Service の基本的な設定は wizard で自動的に作成される &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.serviceprocess.serviceinstaller_members.aspx"&gt;ServiceInstaller&lt;/A&gt; と &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.serviceprocess.serviceprocessinstaller.aspx"&gt;ServiceProcessInstaller&lt;/A&gt; の property を設定することで行えます。&lt;/P&gt; &lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ddhy0byf.aspx"&gt;方法 : サービス アプリケーションにインストーラを追加する&lt;/A&gt;&lt;/P&gt; &lt;P&gt;ただ、Installer で proprty で定義されていない設定を追加したい場合も多いでしょう。その場合どうしたらよいか？&lt;/P&gt; &lt;P&gt;答えは簡単 &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.configuration.install.installer.aspx"&gt;System.Configuration.Install.Installer&lt;/A&gt; class の &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.configuration.install.installer.install.aspx"&gt;Install&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.configuration.install.installer.uninstall.aspx"&gt;Uninstall&lt;/A&gt; method を override する。&lt;/P&gt;&lt;PRE class="Code"&gt;&lt;CODE&gt;namespace SampleService&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; [RunInstaller(true)]&lt;BR&gt;&amp;nbsp; public partial class ProjectInstaller : Installer&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ProjectInstaller()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 追加&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void Install(IDictionary stateSaver)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.Install(stateSaver);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 追加する設定を登録&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 追加&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void Uninstall(IDictionary savedState)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.Uninstall(savedState);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 追加する設定を削除&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE class="Code"&gt;&lt;CODE&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;こんな感じで簡単にできます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/193165.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>安全でないライブラリのロードにより、リモートでコードが実行される</title><link>http://blogs.wankuma.com/tyappi/archive/2010/08/25/192569.aspx</link><pubDate>Wed, 25 Aug 2010 05:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/08/25/192569.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/192569.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/08/25/192569.aspx#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/192569.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/192569.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://www.microsoft.com/japan/technet/security/advisory/2269637.mspx"&gt;安全でないライブラリのロードにより、リモートでコードが実行される&lt;/A&gt; という seurity advisory が出ています。まあ、ここ読んでいるような人にとってはすでに知っていることだと思いますが。 
&lt;P&gt;ちょっと興味があったので、いろいろ情報あさっていましたが、正確なところはわかりませんがどうやら下記のようなことじゃないかと。 
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx"&gt;LoadLibrary&lt;/A&gt; や &lt;A href="http://msdn.microsoft.com/en-us/library/ms684179(VS.85).aspx"&gt;LoadLibraryEx&lt;/A&gt; 等を利用して DLL を動的に load する場合、絶対 path を指定しないと &lt;A href="http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx"&gt;Dynamic-Link Library Search Order&lt;/A&gt; の順序に従って DLL が検索されます。 
&lt;P&gt;この検索先の中に current directory が含まれるのがミソで、load する予定の DLL と名前が完全に一致する DLL が存在するとそいつが読み込まれてしまう。 
&lt;P&gt;直接呼ばれる関数に攻撃 code を仕込んでおけばいいわけですが、Win32 DLL には &lt;A href="http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspx"&gt;DllMain&lt;/A&gt; という DLL を load されるときに自動的に実行される entry point があるので、こいつを使えばもっとお手軽。 
&lt;P&gt;ここまでは全然新しくない話なんですが、今回出てきたのは current directory が remote (SMB や WebDav) 上だった場合、remote に file を配置しておくだけで攻撃が可能ということ。 
&lt;P&gt;個人的には application が file を開くときに current directory を変更して開くなんて考えずらいと思っていましたが、この攻撃が可能な application は 40 以上存在するとのことなので。 
&lt;P&gt;&lt;A href="http://www.computerworld.com/s/article/9180901/Update_40_Windows_apps_contain_critical_bug_says_researcher"&gt;Update: 40 Windows apps contain critical bug, says researcher&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;この問題への対応としては、&lt;A href="http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx"&gt;Dynamic-Link Library Security&lt;/A&gt; にまとめられています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx"&gt;LoadLibrary&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/en-us/library/ms684179(VS.85).aspx"&gt;LoadLibraryEx&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx"&gt;CreateProcess&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx"&gt;ShellExecute&lt;/A&gt; を呼び出すときは可能な限り fully qualified path を利用する。 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms682600(VS.85).aspx"&gt;Dynamic-Link Library Redirection&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/en-us/library/aa375365(VS.85).aspx"&gt;Manifests&lt;/A&gt; を利用し正しい DLL を呼び出すことを強制する。 
&lt;LI&gt;Registry HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode を変更し DLL の検索順序を変更する。 
&lt;LI&gt;DLL を呼び出す前に &lt;A href="http://msdn.microsoft.com/en-us/library/ms686203(VS.85).aspx"&gt;SetDllDirectory&lt;/A&gt; に "" を指定して current directory の path を除去する。 (Multi thread, process 間での競合注意) 
&lt;LI&gt;Safe process search mode が有効になっていないときは &lt;A href="http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx"&gt;SearchPath&lt;/A&gt; を利用しない。&lt;A href="http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx"&gt;SearchPath&lt;/A&gt; をどうしても利用する必要があるときは先に &lt;A href="http://msdn.microsoft.com/en-us/library/dd266735(VS.85).aspx"&gt;SetSearchPathMode&lt;/A&gt; に BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE を指定して呼び出した後に利用する。Current directory は最後に回されるが除去はされないので注意が必要。 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx"&gt;LoadLibrary&lt;/A&gt;?が検索する DLL の検索順序は OS によって異なるので、推測だけで行わない。ちゃんと OS version 確認しましょう。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;基本的な対応としては application code の修正です。ということで、DLL を dynamic load している application の開発者は について既存の code に問題が無いかご確認ください。&lt;/P&gt;
&lt;P&gt;なお、DLL の検索対象から current directory を除去する方法については WebDav や SMB のみ除去するといった設定が可能になる patch が提供されています。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://support.microsoft.com/kb/2264107/"&gt;DLL 検索パス アルゴリズムを制御する新しい CWDIllegalInDllSearch レジストリ エントリについて&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;WebDav のみ SMB のみ不可といった制限も可能なので&amp;nbsp;patch を適用した上で設定を変更しておいたほうがよいでしょう。WebDav, SMB 不可程度であればほぼ影響は無いでしょうから。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.technet.com/b/jpsecurity/archive/2010/08/24/3351474.aspx"&gt;新たなリモートの攻撃手法に関するアドバイザリ 2269637 を公開&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspx"&gt;DLL Preloading Attacks&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://isc.sans.edu/diary.html?storyid=9445"&gt;DLL hijacking vulnerabilities&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/192569.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>Excel Workbook を扱う方法いろいろ (Excel 2003 以前)</title><link>http://blogs.wankuma.com/tyappi/archive/2010/06/27/190647.aspx</link><pubDate>Sun, 27 Jun 2010 18:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/06/27/190647.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/190647.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/06/27/190647.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/190647.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/190647.aspx</trackback:ping><description>&lt;P&gt;Excel Workbook を読み込む方法はいろいろ存在します。Excel 2003 までだとこんなのがありました。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Microsoft Excel Object Model (&lt;A href="http://msdn.microsoft.com/en-us/library/ms221375.aspx"&gt;Automation&lt;/A&gt;) を利用 
&lt;LI&gt;&lt;A href="http://blogs.wankuma.com/tyappi/admin/Microsoft%20OLE%20DB%20Provider%20for%20Microsoft%20Jet"&gt;Microsoft JET&lt;/A&gt; を利用 
&lt;LI&gt;Excel binary file format を直接扱う&lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Microsoft Excel Object Model (&lt;A href="http://msdn.microsoft.com/en-us/library/ms221375.aspx"&gt;Automation&lt;/A&gt;) を利用&lt;/H3&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms221375.aspx"&gt;Automation&lt;/A&gt; (&lt;A href="http://msdn.microsoft.com/en-us/library/ms680573.aspx"&gt;COM&lt;/A&gt;) を利用する方法はあまりにも有名なので、あえて説明する必要すらありませんね。これを利用すれば Microsoft Excel の全機能を制限なく扱うことができます。ただし、Microsoft Excel を利用するので Microsoft Excel が install されている環境でないと利用できません。また、server-side での実行も support されていません。詳しくは下記参照。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/257757"&gt;Office のサーバーサイド オートメーションについて&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Excel binary file format を直接扱う&lt;/H3&gt;
&lt;P&gt;Binary format を直接扱う方法はおそらくやる人いないでしょう。昔は仕様が公開されていませんでしたが、現在は公開されています。まあ、やるのであれば頑張ってくださいとしか。。。 
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/cc313154.aspx"&gt;[MS-XLS]: Excel Binary File Format (.xls) Structure Specification&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;&lt;A href="http://blogs.wankuma.com/tyappi/admin/Microsoft%20OLE%20DB%20Provider%20for%20Microsoft%20Jet"&gt;Microsoft JET&lt;/A&gt; を利用&lt;/H3&gt;
&lt;P&gt;&lt;A href="http://blogs.wankuma.com/tyappi/admin/Microsoft%20OLE%20DB%20Provider%20for%20Microsoft%20Jet"&gt;Microsoft JET&lt;/A&gt; を利用する方法は知らない人結構いるんじゃないでしょうか？ &lt;A href="http://blogs.wankuma.com/tyappi/admin/Microsoft%20OLE%20DB%20Provider%20for%20Microsoft%20Jet"&gt;Microsoft JET&lt;/A&gt; とはもともと Microsoft Access DB engine に接続するための data access provider ですが、その他の data source を扱うための &lt;A href="http://msdn.microsoft.com/en-us/library/ms715373.aspx"&gt;Excel driver&lt;/A&gt; や &lt;A href="http://msdn.microsoft.com/en-us/library/ms714091.aspx"&gt;Text File Driver&lt;/A&gt; を同梱しています。 
&lt;P&gt;これらの driver は当初 &lt;A href="http://msdn.microsoft.com/ja-jp/library/dd148549.aspx"&gt;MDAC&lt;/A&gt; として別の component として提供されていましたが、Windows 2000 から OS に同梱されるようになり、Windows XP 以降では別の component として提供されることは無くなりました。なお、JET は MDAC 2.7 以降で &lt;A href="http://msdn.microsoft.com/ja-jp/library/dd148549.aspx"&gt;MDAC&lt;/A&gt; から削除されていますが、Windows 2000 以降の OS では標準で &lt;A href="http://blogs.wankuma.com/tyappi/admin/Microsoft%20OLE%20DB%20Provider%20for%20Microsoft%20Jet"&gt;Microsoft JET&lt;/A&gt; (version が古い可能性はある) が含まれているため、そのまま利用できます。 
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/data/dd162300.aspx"&gt;Universal Data Access 関連ダウンロード&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/239114/"&gt;Microsoft Jet 4.0 データベース エンジン用の最新の Service Pack の入手方法&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms810810.aspx"&gt;Data Access Technologies Road Map&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;具体的な利用方法は下記を参照してください。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/316934/"&gt;Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/cc464080.aspx"&gt;コード : Excel のデータをデータ セットに読み込む (Visual Basic)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/dd148538.aspx"&gt;DAO から ADO への移植2&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms141683.aspx"&gt;Excel ソース&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://blogs.wankuma.com/tyappi/admin/Excel%20のクエリ%20テーブルで動的レポートを作成する"&gt;Excel のクエリ テーブルで動的レポートを作成する&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms254500.aspx"&gt;接続文字列の構文 (ADO.NET)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/magazine/cc163536.aspx"&gt;テスト データに Excel を使用する&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/195951/"&gt;ASP から ADO を使用して Excel のデータのクエリおよび更新を行う方法&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/303814/"&gt;[HOWTO] VB または VBA から ADOX を Excel データで使用する&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;詳細の公式 reference は &lt;A href="http://msdn.microsoft.com/en-us/library/ms710252.aspx"&gt;ODBC&lt;/A&gt; のものしかないですねぇ。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms715373.aspx"&gt;Microsoft Excel Driver Programming Considerations&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;まあ、この公式情報の少なさが積極的に利用されない理由だったりすると思うんですが。もっともあまりにも簡単に扱えると Microsoft Excel の売り上げに響く可能性がありますからねぇ。。。&lt;/P&gt;
&lt;P&gt;Excel を必要とせず Excel Workbook を扱える &lt;A href="http://blogs.wankuma.com/tyappi/admin/Microsoft%20OLE%20DB%20Provider%20for%20Microsoft%20Jet"&gt;Microsoft JET&lt;/A&gt;&amp;nbsp;ですが、いくつか制限があります。代表的なものとしては下記。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;1 cell で扱える文字長は 255 (Unicode 510 bytes) まで 
&lt;LI&gt;Password 保護された workbook は扱えない&amp;nbsp;(&lt;A href="http://technet.microsoft.com/ja-jp/library/cc984234.aspx"&gt;IRM 保護&lt;/A&gt;されたのももちろんダメ) 
&lt;LI&gt;Cell の data しか扱えない (AutoShape や Graph は扱えない)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;これらの制限がありますが、それなりに利用価値はあるでしょう。Server-Side でも support されていますので。&lt;/P&gt;
&lt;P&gt;あと、Microsoft Excel 2002 から利用可能になった、XML format (Office Open XML とは異なる) がありますが、ここでは扱いませんのであしからず。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/190647.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>AssemblyFileVersion</title><link>http://blogs.wankuma.com/tyappi/archive/2010/06/26/190623.aspx</link><pubDate>Sat, 26 Jun 2010 18:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/06/26/190623.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/190623.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/06/26/190623.aspx#Feedback</comments><slash:comments>623</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/190623.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/190623.aspx</trackback:ping><description>&lt;P&gt;先日、version 管理を自動化しようとしてやってしまった失敗。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms973869.aspx"&gt;アプリケーションのバージョンの管理&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;上記に記述があるように &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.reflection.assemblyversionattribute.aspx"&gt;AssemblyVersionAttribute&lt;/A&gt; に "1.0.*" を指定して compile したわけだけど、その時 &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.reflection.assemblyfileversionattribute.aspx"&gt;AssemblyFileVersionAttribute&lt;/A&gt; にも "1.0.*" を指定してしまった。&lt;/P&gt;
&lt;P&gt;Unit test 通った後でちょっと忙しかったこともあり、他の人に compile お願いといって test までお願いすることに。その後、test で log 出力がうまくいかないと連絡が。。。&lt;/P&gt;
&lt;P&gt;Log 出力は &lt;A href="http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.logging.filelogtracelistener.aspx"&gt;FileLogTraceListener&lt;/A&gt; を利用しているんですけど、その初期化時に &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.configuration.configurationexception.aspx"&gt;System.ConfigurationException&lt;/A&gt;「パスに無効な文字が含まれます。」で落ちる。正確には&lt;A href="http://msdn.microsoft.com/ja-jp/library/system.security.permissions.fileiopermission_members.aspx"&gt;System.Security.Permissions.FileIOPermission&lt;/A&gt;.HasIllegalCharacters(String[] str) でね。Configuration file がおかしいのかな？と思っていくら変更してもダメ。&lt;/P&gt;
&lt;P&gt;しゃー無いので build し直してみる。すると下記警告が。。。&lt;/P&gt;
&lt;P&gt;アセンブリの生成 -- 'ファイル バージョン' に指定されたバージョン '1.0.*' は正常な 'major.minor.build.revision' フォーマットではありません。 
&lt;P&gt;とりあえず修正してみた。。。結果、正常に動作した！ これかよ！ 
&lt;P&gt;Assembly vesion と file version は一致させたかったので、&lt;A href="http://msdn.microsoft.com/ja-jp/library/system.reflection.assemblyfileversionattribute.aspx"&gt;AssemblyFileVersionAttribute&lt;/A&gt; を comment out して解決。&lt;/P&gt;
&lt;P&gt;ちゃんと reference 読んでみると &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.reflection.assemblyversionattribute.aspx"&gt;AssemblyVersionAttribute&lt;/A&gt; には "*" の説明載っているけど &lt;A href="http://msdn.microsoft.com/ja-jp/library/system.reflection.assemblyfileversionattribute.aspx"&gt;AssemblyFileVersionAttribute&lt;/A&gt; には載っていない。あ～そのなのね。確認すると build された assembly の file version には "1.0.*" がそのまま入っていました。 
&lt;P&gt;でも、「パスに無効な文字が含まれます。」この message は無いな～。そもそも path の問題じゃないし。もう少し、わかりやすい message 返してよ。 
&lt;P&gt;ってゆうか compile 時に警告ではなく error にしてよ。動かないのあるのなら。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/190623.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>VS2010 Unit Testing で XML の test data を project root 以外に配置すると。。。</title><link>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188654.aspx</link><pubDate>Mon, 03 May 2010 17:59:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188654.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/188654.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188654.aspx#Feedback</comments><slash:comments>48</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/188654.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/188654.aspx</trackback:ping><description>&lt;P&gt;VS2010 で &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms182527.aspx"&gt;Data-Driven Unit Testing&lt;/A&gt; を行うため、wizard にしたがって XML file を DataSource に設定すると下記のような attributes がつきます。&lt;/P&gt;&lt;PRE class=Code&gt;&lt;CODE&gt;[DeploymentItem("TyappiTest\\TestData.xml")]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.XML"
  , "|DataDirectory|\\TestData.xml"
  , "case"
  , DataAccessMethod.Sequential)]
[TestMethod()]&lt;CODE&gt;&lt;/PRE&gt;
&lt;P&gt;XML file が project の root に配置されている場合には問題ありませんが、sub folder を配下に格納した場合にはうまく動作しません。"TestData" という sub folder に配置した場合、 wizard で自動生成される attributes は下記になります。&lt;/P&gt;&lt;PRE class=Code&gt;&lt;CODE&gt;[DeploymentItem("TyappiTest\\TestData\\TestData.xml")]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.XML"
  , "|DataDirectory|\\TestData.xml"
  , "case"
  , DataAccessMethod.Sequential)]
[TestMethod()]&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;この状態で unit test を実行すると下記 error が発生します。&lt;/P&gt;
&lt;P&gt;&lt;SAMP&gt;単体テスト アダプターがデータ ソースに接続できなかったか、データを読み込めませんでした。このエラーのトラブルシューティングの詳細については、MSDN ライブラリの「Troubleshooting Data-Driven Unit Tests」(http://go.microsoft.com/fwlink/?LinkId=62412) を参照してください。エラーの詳細: オブジェクト参照がオブジェクト インスタンスに設定されていません。&lt;/SAMP&gt;&lt;/P&gt;
&lt;P&gt;この問題を修正するためには下記のように attributes を修正します。&lt;/P&gt;&lt;PRE class=Code&gt;&lt;CODE&gt;[DeploymentItem("TyappiTest\\TestData\\TestData.xml")]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.XML"
  , "|DataDirectory|\\TestData\\TestData.xml"
  , "case"
  , DataAccessMethod.Sequential)]
[TestMethod()]&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;上記のように &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms243384.aspx"&gt;DataSourceAttribute constructor&lt;/A&gt; の第二引数に与えられている path を手動で修正する必要があります。&lt;/P&gt;
&lt;P&gt;なお、対象の XML file の property "出力ディレクトリにコピー" が「コピーしない」になっている場合も同様の error が発生しますので、「新しい場合にはコピーする」もしくは「常にコピーする」に設定するのをお忘れずに。&lt;/P&gt;
&lt;P&gt;というか、wizard だけで問題なく動くようにしてくれないかなぁ。。。&lt;/P&gt;&lt;/CODE&gt;&lt;/CODE&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/188654.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>異なる Encoding で利用できない文字を検出する Class 改</title><link>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188650.aspx</link><pubDate>Mon, 03 May 2010 17:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188650.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/188650.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188650.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/188650.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/188650.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/tyappi/archive/2010/01/03/184574.aspx"&gt;以前作ったもの&lt;/A&gt;を &lt;A href="http://msdn.microsoft.com/ja-jp/library/bb383977.aspx"&gt;extension method&lt;/A&gt; に変更してみた。&lt;/P&gt;&lt;PRE class=Code&gt;&lt;CODE&gt;using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Text;
namespace Tyappi.Text
{
  /// &amp;lt;summary&amp;gt;
  ///   Encoding class を拡張します。
  /// &amp;lt;/summary&amp;gt;
  public static class EncodingExtention
  {
    #region Public Methods
    /// &amp;lt;summary&amp;gt;
    ///   変換できない文字列が含まれているか確認します。
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="value"&amp;gt;確認対象の文字列。&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;
    ///   変換できない文字列が含まれる場合には true を返します。
    ///   変換できない文字列が含まない場合には false を返します。
    /// &amp;lt;/returns&amp;gt;
    public static Boolean IsCovertable(
        this Encoding encoding
      , String value)
    {
      Boolean result;
      if (value == null)
      {
        result = true;
      }
      else
      {
        String converted = EncodingExtention.CyclicConvert(encoding, value);
        result = value.Equals(converted, StringComparison.InvariantCulture);
      }
      return result;
    }
    /// &amp;lt;summary&amp;gt;
    ///   変換できない文字列を取得します。
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="value"&amp;gt;確認対象の文字列。&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;
    ///   変換できない文字の index と文字で構成される KeyValuePair の
    ///   ReadOnlyCollection を返します。
    ///   変換できない文字が存在しない場合には要素 0 の ReadOnlyCollection を返します。
    /// &amp;lt;/returns&amp;gt;
    public static ReadOnlyCollection&amp;lt;KeyValuePair&amp;lt;Int32, String&amp;gt;&amp;gt; 
      GetInconvertableChars(this Encoding encoding, String value)
    {
      List&amp;lt;KeyValuePair&amp;lt;Int32, String&amp;gt;&amp;gt; result 
        = new List&amp;lt;KeyValuePair&amp;lt;Int32, String&amp;gt;&amp;gt;();
      if (value != null)
      {
        String destination = CyclicConvert(encoding, value);
        TextElementEnumerator enumerator 
          = StringInfo.GetTextElementEnumerator(value);
        while (enumerator.MoveNext())
        {
          String sourceChar = enumerator.Current.ToString();
          String destinationChar
            = destination.Substring(
                  enumerator.ElementIndex
                , sourceChar.Length);
          if (!sourceChar.Equals(destinationChar))
          {
            KeyValuePair&amp;lt;Int32, String&amp;gt; pair
              = new KeyValuePair&amp;lt;int, string&amp;gt;(enumerator.ElementIndex, sourceChar);
            result.Add(pair);
          }
        }
      }
      return result.AsReadOnly();
    }
    #endregion
    #region Private Methods
    /// &amp;lt;summary&amp;gt;
    ///   一度指定した encoding へ変換を行った後、元の encoding へ
    ///   再変換します。
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="source"&amp;gt;対象の文字列。&amp;lt;/param&amp;gt;
    /// &amp;lt;param name="encoding"&amp;gt;変換先の encoding。&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;再変換を行った文字列。&amp;lt;/returns&amp;gt;
    private static String CyclicConvert(Encoding encoding, String source)
    {
      String result = null;
      if (source != null)
      {
        Byte[] encodedBytes = encoding.GetBytes(source);
        result = encoding.GetString(encodedBytes);
      }
      return result;
    }
    #endregion
  }
}&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/bb383977.aspx"&gt;Extension method&lt;/A&gt; 良すぎ！ ちょっと前から中毒状態です。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/188650.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>Visual Studio Unit Test では Unicode CSV は扱えない</title><link>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188649.aspx</link><pubDate>Mon, 03 May 2010 16:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188649.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/188649.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188649.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/188649.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/188649.aspx</trackback:ping><description>&lt;p&gt;Visual Studio で Unicode とか &lt;a href="http://www.jisc.go.jp/app/pager?id=2518"&gt;JISX0213&lt;/a&gt; で拡張された文字を扱った unit test を作りたかったりするわけですが、Visual Studio Unit Test で扱える CSV の encoding は default ANSI code page のみです。UTF-8, UTF-16 で保存しても、文字化けしてまともに扱えません。&lt;/p&gt; &lt;p&gt;ではどうするべきか？&lt;/p&gt; &lt;p&gt;XML か DB 使うしかないですね。&lt;/p&gt; &lt;p&gt;ってか、Encoding ぐらい指定させてよ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/188649.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>EventLogTraceListener の実装がひどい (Windows XP)</title><link>http://blogs.wankuma.com/tyappi/archive/2010/04/11/187964.aspx</link><pubDate>Sun, 11 Apr 2010 03:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/04/11/187964.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/187964.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/04/11/187964.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/187964.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/187964.aspx</trackback:ping><description>&lt;P&gt;「&lt;A href="http://blogs.wankuma.com/tyappi/archive/2010/04/11/187963.aspx"&gt;EventLog.SourceExist method は例外を垂れ流す&lt;/A&gt;」の続き。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.eventlog.sourceexists.aspx"&gt;EventLog.SourceExist&lt;/A&gt; method がまずいことを書きましたが、&lt;A href="http://msdn.microsoft.com/ja-jp/library/2s3yhxyf.aspx"&gt;EventLogTraceListener&lt;/A&gt; classs の Windows XP での実装がおそらくこれを利用しているために深刻な問題が。とりあえず、Windows XP で下記 code を実行してみてください。&lt;/P&gt;&lt;PRE class=CODE&gt;&lt;CODE&gt;using System;
using System.Diagnostics;

class Program
{
  static void Main(string[] args)
  {
    TraceSource traceSource = new TraceSource("TestTraceSource");
    traceSource.Switch.Level = SourceLevels.Error;
    traceSource.Listeners.Add(new EventLogTraceListener("TestApplication"));
    traceSource.TraceEvent(TraceEventType.Error, 1, "Test");
  }
}&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;結果&lt;/P&gt;&lt;PRE&gt;&lt;SAMP&gt;ハンドルされていない例外: System.Security.SecurityException: ソースが見つかりま
せんでしたが、いくつかまたはすべてのログを検索できませんでした。アクセス不可能な
ログ: Security
   場所 System.Diagnostics.EventLog.FindSourceRegistration(String source, String
 machineName, Boolean readOnly)
   場所 System.Diagnostics.EventLog.SourceExists(String source, String machineNa
me)
   場所 System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, Str
ing currentMachineName)
   場所 System.Diagnostics.EventLog.WriteEvent(EventInstance instance, Byte[] da
ta, Object[] values)
   場所 System.Diagnostics.EventLog.WriteEvent(EventInstance instance, Object[]
values)
   場所 System.Diagnostics.EventLogTraceListener.TraceEvent(TraceEventCache even
tCache, String source, TraceEventType severity, Int32 id, String message)
   場所 System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int3
2 id, String message)&lt;/SAMP&gt;&lt;/PRE&gt;
&lt;P&gt;この現象なんですけど、Windows Vista, Windows 7 環境では再現しないんですよね。正常終了します。内部の実装 OS によって違ってるとしか考えようがない。&lt;/P&gt;
&lt;P&gt;2010/4/25 追記&lt;/P&gt;
&lt;P&gt;.Net Framework 4.0 では Windows XP 環境でも例外発生しません。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/187964.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>EventLog.SourceExist method は例外を垂れ流す</title><link>http://blogs.wankuma.com/tyappi/archive/2010/04/11/187963.aspx</link><pubDate>Sun, 11 Apr 2010 03:04:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/04/11/187963.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/187963.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/04/11/187963.aspx#Feedback</comments><slash:comments>469</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/187963.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/187963.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.eventlog.sourceexists.aspx"&gt;EventLog.SourceExist&lt;/A&gt; method は check method なのに例外を垂れ流します。これで困るのが standard user で利用した場合。とりあえず、下記 code を実行してみてください。&lt;/P&gt;&lt;PRE class=Code&gt;&lt;CODE&gt;using System;
using System.Diagnostics;

class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine(EventLog.SourceExists("存在しない source"));
  }
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;下記例外が発生します。&lt;/P&gt;
&lt;P&gt;&lt;SAMP&gt;ハンドルされていない例外: System.Security.SecurityException: ソースが見つかりませんでしたが、いくつかまたはすべてのログを検索できませんでした。アクセス不可能なログ: Security&lt;/SAMP&gt;&lt;/P&gt;
&lt;P&gt;直接の原因は下記 registry key の ACL。&lt;/P&gt;
&lt;P&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security&lt;/P&gt;
&lt;P&gt;Windows 7 の既定では下記のように ACL が構成されています。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=1 cellPadding=2&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH&gt;Account &lt;/TD&gt;
&lt;TH&gt;ACL &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TR&gt;
&lt;TD&gt;System&lt;/TD&gt;
&lt;TD&gt;フル コントロール&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Administrators&lt;/TD&gt;
&lt;TD&gt;フル コントロール&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;eventlog&lt;/TD&gt;
&lt;TD&gt;読み取り&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;ということで、standard users には権限が無いですね。&lt;/P&gt;
&lt;P&gt;しかし、&lt;A href="http://msdn.microsoft.com/ja-jp/library/system.security.securityexception.aspx"&gt;SecurityException&lt;/A&gt; とはいえ、check method で例外を垂れ流すのはひどいですね。読み取りの場合、権限無いものは無視するのが鉄則だと思うのですが。。。次の version でもいいのでぜひ修正して欲しいものですね。&lt;/P&gt;
&lt;P&gt;既存との互換性を考慮して修正しない場合には下記 method を追加する手もあると思いますね。&lt;/P&gt;
&lt;P&gt;EventLog.SourceExist(string source, string machineName, string logName)&lt;/P&gt;
&lt;P&gt;最も利用される log は "Application" なので、多くの場合こちらを利用することで回避できるでしょう。&lt;/P&gt;
&lt;P&gt;2010/4/25 追記&lt;/P&gt;
&lt;P&gt;.NET Framework 4.0 でもこの問題は再現しますね。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/187963.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>Visual Studio の unit test framework は x64 で動作できない</title><link>http://blogs.wankuma.com/tyappi/archive/2010/01/03/184606.aspx</link><pubDate>Sun, 03 Jan 2010 19:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/01/03/184606.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/184606.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/01/03/184606.aspx#Feedback</comments><slash:comments>218</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/184606.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/184606.aspx</trackback:ping><description>&lt;p&gt;C++/CLI で作った class の unit test を作成している時のこと。x86 なら動くのに x64 では動かない！&lt;/p&gt; &lt;p&gt;環境: Visual Studio 2008 Professional Edition SP1&lt;/p&gt; &lt;p&gt;C++/CLI で作った managed class に対する C++ test project を作成した場合、platform を x64 に切り替えても test 用の dll がなぜか x86 で compile されている現象を dumpbin.exe にて確認。&lt;/p&gt; &lt;p&gt;C++/CLI で作った managed class に対する C# test project を作成した場合、platform を x64 ると test 用の dll を読み込む段階で System.BadImageFormatException が発生。Host する "VSTestHost.exe" が x86 用 image なのでその影響でしょうね。&lt;/p&gt; &lt;p&gt;C++/CLI で projects を作っていると x64 でも unit test が必要になると思うのですが、この仕様？は何でしょうかね。なんとかしてくれ！&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/184606.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>