2006年冬から丸二年、Managed C++ (Visual Studio 2003)で作成してきたプロジェクトを朝から晩までコーディングしてようやく C++/CLIとC# (Visual Studio 2005) に移行しました。
そんなこんなで、あと1箇所ってときに寝る時間が迫ってきたので、忘れないうちにポイントだけまとめておきます。
装備の確認
まず使ったツールと機能を確認しておきます。
- Visual Studio 2005
- テキスト置換機能(Ctrl + H)
- フォルダ以下のファイル中のテキスト置換機能 (Ctrl + Shift + H)
以上。って、少ないな装備。
手順
まずは大まかに手順を説明します。
- Visual Studio 2003 プロジェクトを Visual Studio 2005 で開く。
- Visual Studio 2005 の変換ウィザードで変換。
- プロジェクトに「/clr:oldSyntax 」オプションが付いてることを確認してビルドする。
- 旨くいけば、次の子手順を飛ばす。
- イベント登録時などに渡す関数アドレスの取り出し方が変わっているので、修正する。(FuncA→&ClassA::FuncA)
- (ほかにもあると思うけど忘れた・・)
- プロジェクトの設定で「/clr:oldSyntax 」を「/clr 」に移すと大量のエラーを食らうので、次の事を先に行っておく。
- C# に移行できそうなモジュールをなるべく C# に移行する。
- 逆にネイティブなスタティックライブラリなどを利用している部分は、C# に移行できない・・・、というのを把握しておく。(後々、置換作業を行う際に覚えておくと便利)
- (ほかにもあるかな・・?)
- 「/clr」オプションでビルドする。
ここまでで、だいたい3時間~5時間くらい(うち、C# への移行は2時間程度)。ここで、いったん休んでもよい。
ここからが本番。エラーが1000個とか平気で出る上に、「エラーが100個を超えたので、このファイルをコンパイルするのはやめたよ」という旨の表示が出ます。。あきらめないように。
あとは、「変換ガイド: Managed Extensions for C++ から C++/CLI へのプログラムの移行」にある項目をひたすら置換と修正していく。ここでは重要な仕様変更を3つだけピックアップしておきます。
enum列挙子への参照を限定名に変更。
// Managed C++
enum Emmy { Feel, Feet, };
Emmy e = Feel;
// C++/CLI
enum class Emmy { Feel, Feet, };
Emmy e = Emmy::Feel;
typeof演算子を変更。
// Managed C++
System::Type * t = typeof(hogegaga);
// C++/CLI
System::Type ^ t = hogegaga::typeid;
プロパティの定義変更。
// Managed C++
__property int get_Piyo() { return this->piyo; }
__property void set_Piyo(int value) { this->piyo = value; }
// C++/CLI (1)
property int Piyo;
// C++/CLI (2)
property int Piyo{
int get() { return this->piyo; }
void set(int value) { this->piyo = value; }
}
// C++/CLI (3)
property int Piyo { int get(); void set(int value); }
int Hoge::Piyo::get() { return this->piyo; }
void Hoge::Piyo::set(int value) { this->piyo = value; }
イベント&デリゲート
別にイベント&デリゲートは、マイクロソフトの変換ガイドの通りに変換すれば楽勝です。ただ、msdn「汎用イベント ハンドラのインスタンスを使用します」に合うように変換するのは結構骨が折れます。
まとめ
というわけで、/clr:oldSyntax をとった際に出るエラーが一番つらかったです。特に最初のほうは、1000個から全然減らないですし、ビルドすると大量のエラーが発赤しますから、小まめにファイル単位でコンパイルしながら確認を取っていきました。それでも4時間もすれば、ようやくビルドエラーが 1000個を切り、さらに4時間後にようやく 1桁になって・・・、現在に至ります。
ま、ここまでやって一番思ったことは、「あきらめないこと」と、どんなにダメな構造だってわかっていても、とりあえず先に C++/CLI あるいは C# に移行することです。妙にこだわりだすと、いつまでたっても C++/CLI に移行できないですし、移行しかけの時期にサポートが飛んでくるかもしれません。それよりもまず、時間が少しあいたときに、一気に C++/CLI に移行することが肝心です。特に、C# へ移行してしまえば、あとは強力なリファクタリングが可能になりますから、先ず C++/CLI あるいは C# へ移行することが大事です。
ちなみに、一気に C# へ移行するのは結構大変でしたので、まず C++/CLI に移行してから ちょっとずつ C# へ移行していくことをお勧めします。
以上
追記:2008年2月25日
無事に、C++/CLI & C#でツールが起動できるようになりました(若干、置換作業にミスってたっぽいけど)。