.NETにおける64ビットプロセスと32ビットプロセスについて
■1プロセスにおける32ビットと64ビットの混在
ネィティブアプリケーションの場合、プラットフォームの異なるExeとDllは共存できません。
ネイティブアプリケーションはビルド時に、どちらにするか指定してビルドする必要があります。 .NET の場合、ビルド時にプラットフォームに"x86","x64"以外に"Any CPU"が選択できます。 Any CPUを選択した場合次のような挙動になります。
Any CPUでExeを作成した場合、64bitOSで32bitプロセスが動作できません。 これを解決するには、以下に述べているように、CorFlags を用いてExeを修正する必要があります。 参考:64bitOSでAnyCPUでコンパイルした32bitプロセスを動かす この問題を解決するために、.NET4.5以降では「32ビットを優先にする」というオプションを指定できます。 これはAny CPUではありますが、32bitで動作が可能な場合は32bitで動作します。 ■プラットフォームの異なるプロセスの相互運用 1つのプロセスで32bitと64bitは混在して動作しないことは説明しました。 しかし、64ビット版のWindowsでは64bitプロセスと32ビットプロセス間のプロシージャコールはサポートされています。 つまり64ビットのアウトプロセスのCOMサーバーは32ビットのクライアントと通信でき、逆に32ビットのアウトプロセスのCOMサーバーは64ビットのクライアントと通信できます。 .NETでCOMサーバーを作成するのは下記を参考にしてください。 How to develop an out-of-process COM component by using Visual C++, Visual C#, or Visual Basic .NET 実際にCOMサーバーを作成するには、上記のページからCSExeCOMServerをダウンロードします。 プロジェクトのプロパティーを以下のいづれかに修正してください。 32ビットのアウトプロセスを作成する場合 「ビルド」タブのプラットフォームターゲット 64ビットのアウトプロセスを作成する場合 「ビルド」タブのプラットフォームターゲット 実際にビルドしてCOMを登録すると、32ビットのCOMサーバー、または64ビットのCOMサーバーどちらであっても、32ビット、64ビットの両方のクライアントから使用できることがわかります。 詳しい詳細は、ダウンロードしたReadme.txtを参考にしてください。実際の作り方が記述してあります。 なお、アウトプロセスのCOMサーバーなので以下のようにスタティックな変数を使用すれば、異なるプラットフォームのプロセス間でのデータの共有が可能です。 public class CSSimpleObject : ReferenceCountedObject, ICSSimpleObject WindowsではこのようにアウトプロセスのCOMサーバーを利用することにより、異なるプラットフォームのプラットフォームであっても、労力をかけずに連携できると思います。 UNIXのgccで32bitプロセスと64bitプロセスの連携やったときは、きつかった。 ■プラットフォームターゲットを明示する理由 プラットフォームターゲットに「Any CPU」を選択してはいけません。 COMオブジェクト作成中にアプリケーションがハングします。 PEヘッダ中のIMAGE_NT_HEADERS.FileHeader.Machineに IMAGE_FILE_MACHINE_I386がセットされているためです。 64ビットOSの場合、COMとしては32ビットとして動作することを期待していますが、実際64bitとして動作してしまうのです。 この値はVisualStdioに付属しているbumpbinを用いて確認できます。以下のようなコマンドを実行してください。 dumpbin CSExeCOMServer.exe /headers この結果を見てみましょう x86を明示した場合。 File Type: EXECUTABLE IMAGEx64を明示した場合。 File Type: EXECUTABLE IMAGE Any Cpu File Type: EXECUTABLE IMAGE Any Cpuのヘッダにはx86と記述されていますが、実際、.NETとしては64ビットで動作するために不整合が出てしまいます。 アウトプロセスのCOMを作成する場合は、プラットフォームは絶対に指定してビルドをしなければなりません。
by mima_ita
| 2013-12-01 02:50
| .NET
|
by mima_ita 検索
カテゴリ
全体
実験 VBA 泣き言 管理 メンタルヘルス memo buildbot php テスト subversion book JQuery python R .NET box2d SQLSERVER node.js ruby 未分類 最新の記事
以前の記事
2014年 07月
2014年 06月 2014年 05月 2014年 04月 2013年 12月 2013年 11月 2013年 10月 2013年 09月 2013年 07月 2013年 06月 2013年 05月 2013年 03月 2012年 10月 2012年 09月 2012年 08月 2012年 04月 2012年 02月 2012年 01月 2011年 10月 最新のトラックバック
その他のジャンル
ブログパーツ
|
|||||||||||||||||||||||||||||||||||||||
ファン申請 |
||