- - PR -
C♯での3GBスイッチのLargeAddressAwareを設定する方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-21 10:23
どんなビルドエラーが出るのか提示してもらえますでしょうか?
(環境が無いので) | ||||||||
|
投稿日時: 2006-08-21 10:49
こんにちは。
r さんが提示していただいたページを参照してみましたが、これはなちゃさんが おっしゃられているように「VisualStudioの環境を操作する機能の説明」であっ て「Visual C++プロジェクト用」だと思います。その点は r さんも理解していた だいていると思います。 ただ、その後で
となるのは、r さんの中で「この『 Visual C++ プロジェクト用』の設定が C# で も可能である」という認識から生まれているのだと思いますが、どうでしょうか。 私個人としては、 C# ではこの操作は不可能なのではないかと思います(これ は推測なので実際は違うかもしれませんが)。 ここからは私の推論です。 ページの説明によれば、これは Visual C++ の機能を拡張するために使用す るもので、書かれているソースファイルは機能拡張を作成する際のソースファイ ルなのだと思います。あくまで Visual C++ のリンカオプションを機能拡張とし て設定する際に用いるもので、その影響を受けるのは Visual C++ のみである と。Visual Basic 6 や C# のソースファイルが掲載されているのは、Visual C++ の “機能拡張オブジェクト” を作成するためにそれらの言語が使えるので、 そのためのソースを掲載しているのではないかと思います。 私が勝手な解釈をしているだけなので、できれば間違いがあれば識者の方に訂 正していただきたいですが(笑)こういったことなのではないかと考えています。 そのあたりの境界が曖昧なまま話が続けられているように感じたので、まずは 「C# で 2GB 以上のメモリ空間が扱える」ことを確認されてから「ではそれには どうすればよいか」の話に移られたほうが建設的なのではと感じました。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||
|
投稿日時: 2006-08-21 12:19
ここにも似たような投稿がありました。
http://www.msnewsgroups.net/group/microsoft.public.dotnet.languages.csharp/topic1221.aspx みなさんが仰る通りC/C++だけの機能のようです。以下引用しておきます。ソースが確かではないので裏付けはMSDNなどで調べた方が良いと思います。 C# doesn't have a link step, and the compiler doesn't have the option to set the LARGEADDRESSAWARE flag. I think you have to do that with Editbin.exe (you can run it as a post-build step). (C#にはリンクというステップはなく、コンパイラにLARGEADDRESSAWAREフラグを設定するオプションはありません。Editbin.exe を使わないとならないと思います。) ということでC#ではEditbin.exeがキーワードになるようです。こちらを調べてみてはどうでしょうか。 | ||||||||
|
投稿日時: 2006-08-21 21:36
EDITBIN.exe リファレンス
COFF 用語集
ということは、ngen でネイティブ コンパイルした後、editbin で変更、、、ですかね。プロジェクト プロパティの「ビルド イベント」で、「ビルド後に実行するコマンド ライン」に登録すればいいね。 ただ、なぜ 2GB 超を扱う必要があるのかを説明していただければ、メモリが少ない PC でも実行できるような仕掛けが出てくるかもしれません。 | ||||||||
|
投稿日時: 2006-08-22 12:13
いろいろご回答ありがとうございます。
ぽぴ王子様のおっしゃられているようにC#やVB.netでは、ビルドのコマンド引数ではプロジェクトモデルの拡張機能の設定が出来ないためマクロを使用してコードから設定することで可能になると思っておりました。 http://msdn2.microsoft.com/ja-jp/library/2ya384e0.aspx 教えていた頂いたEDITBIN.EXEを使用してテストしてみます。 | ||||||||
|
投稿日時: 2006-08-22 22:23
あ・・・ngen は、キャッシュに作るんだorz
私は、ネイティブな実行可能ファイルに対してしか、有効ではないと読み取っています。なので、editbin ツールでも不可能かと思います。なので ngen を通して・・・と思ったのですが、こいつは GAC の中のコンパイル済みキャッシュの中に作るので、まったく不可能ではないけど、操作できません。 手元の .NET 実行ファイルに適用してみましたが、ファイルの更新日時は変わりましたが、何が変わったのか、判別することは出来ませんでした(バイナリ エディタが無いので)。
その判断の基にしているドキュメントは、「Visual C++ 機能拡張オブジェクト モデル > Visual C++ プロジェクト モデル」の下にある、つまり、VC++ プロジェクトに対する説明なわけですね。では、C++ に対する設定が C# や VB.NET に適用できると判断する根拠は、どこにあるのでしょう? 「Visual Basic、Visual C#、および Visual C# プロジェクトの機能拡張オブジェクト モデル」というカテゴリもあるのですが、その下には同様な記述はないようです。また、VS に付属の言語の中で、VC++ だけが特別扱いされていることも、気をつけてください。 | ||||||||
|
投稿日時: 2006-08-23 10:38
提示した手前、更に調べてみました。
また出展元が確かではないのでやって良いのか悪いのか分かりませんが、ここに.NETアセンブリに対してeditbin.exeでスタックサイズを変更するサンプルソースが載っています。試してみたところ書いてある通りでした(ngen.exeは必要ないようです)。 http://blogs.geekdojo.net/richard/archive/2003/10/10/207.aspx 良く分かりませんが、.NETアセンブリでもネイティブEXEでもOSが見る領域(PEヘッダーとか?)は同じ構造をしていて、そこに対して書き換えするツールなのかなと想像します。 # 追記 面白そうなので更に調べてみました。以下の手順で前後のヘッダ内容のdiffを取るとafter.txtには「Application can handle large (>2GB) addresses」が追加されます。 1. dumpbin.exe /headers .NETアセンブリ > before.txt 2. editbin.exe /LARGEADDRESSAWARE .NETアセンブリ 3. dumpbin.exe /headers .NETアセンブリ > after.txt ここの記事を参考にしました http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_05/idnfw11_05_01.html [ メッセージ編集済み 編集者: ryuuji 編集日時 2006-08-23 13:44 ] |