- PR -

C♯での3GBスイッチのLargeAddressAwareを設定する方法

投稿者投稿内容
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2006-08-21 10:23
どんなビルドエラーが出るのか提示してもらえますでしょうか?
(環境が無いので)
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-21 10:49
こんにちは。

r さんが提示していただいたページを参照してみましたが、これはなちゃさんが
おっしゃられているように「VisualStudioの環境を操作する機能の説明」であっ
て「Visual C++プロジェクト用」だと思います。その点は r さんも理解していた
だいていると思います。
ただ、その後で

引用:

rさんの書き込み (2006-08-18 19:08) より:

では、C♯でメモリを3Gに拡張するフラグのついたアプリケーションを開発するのはどのようなすればよろしいのでしょうか。
よろしくお願いいたします。


となるのは、r さんの中で「この『 Visual C++ プロジェクト用』の設定が C# で
も可能である」という認識から生まれているのだと思いますが、どうでしょうか。
私個人としては、 C# ではこの操作は不可能なのではないかと思います(これ
は推測なので実際は違うかもしれませんが)。

ここからは私の推論です。
ページの説明によれば、これは Visual C++ の機能を拡張するために使用す
るもので、書かれているソースファイルは機能拡張を作成する際のソースファイ
ルなのだと思います。あくまで Visual C++ のリンカオプションを機能拡張とし
て設定する際に用いるもので、その影響を受けるのは Visual C++ のみである
と。Visual Basic 6 や C# のソースファイルが掲載されているのは、Visual
C++ の “機能拡張オブジェクト” を作成するためにそれらの言語が使えるので、
そのためのソースを掲載しているのではないかと思います。
私が勝手な解釈をしているだけなので、できれば間違いがあれば識者の方に訂
正していただきたいですが(笑)こういったことなのではないかと考えています。

そのあたりの境界が曖昧なまま話が続けられているように感じたので、まずは
「C# で 2GB 以上のメモリ空間が扱える」ことを確認されてから「ではそれには
どうすればよいか」の話に移られたほうが建設的なのではと感じました。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 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がキーワードになるようです。こちらを調べてみてはどうでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-21 21:36
EDITBIN.exe リファレンス
引用:

EDITBIN.EXE (Microsoft COFF Binary File Editor) は、COFF (Common Object File Format) 形式の 32 ビット バイナリ ファイルの内容を変更するツールです。EDITBIN を使用すると、オブジェクト ファイル、実行可能ファイル、およびダイナミック リンク ライブラリ (DLL) の内容を変更できます。


COFF 用語集
引用:

複数のプラットフォームにまたがって移植できる実行可能ファイル (イメージ) およびオブジェクト ファイル用の 32 ビット プログラミング形式。Microsoft の実装は、ポータブル実行可能 (PE) ファイル形式と呼びます。


 ということは、ngen でネイティブ コンパイルした後、editbin で変更、、、ですかね。プロジェクト プロパティの「ビルド イベント」で、「ビルド後に実行するコマンド ライン」に登録すればいいね。

 ただ、なぜ 2GB 超を扱う必要があるのかを説明していただければ、メモリが少ない PC でも実行できるような仕掛けが出てくるかもしれません。
r
会議室デビュー日: 2006/08/15
投稿数: 18
投稿日時: 2006-08-22 12:13
いろいろご回答ありがとうございます。

ぽぴ王子様のおっしゃられているようにC#やVB.netでは、ビルドのコマンド引数ではプロジェクトモデルの拡張機能の設定が出来ないためマクロを使用してコードから設定することで可能になると思っておりました。
http://msdn2.microsoft.com/ja-jp/library/2ya384e0.aspx

教えていた頂いたEDITBIN.EXEを使用してテストしてみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-22 22:23
あ・・・ngen は、キャッシュに作るんだorz


 私は、ネイティブな実行可能ファイルに対してしか、有効ではないと読み取っています。なので、editbin ツールでも不可能かと思います。なので ngen を通して・・・と思ったのですが、こいつは GAC の中のコンパイル済みキャッシュの中に作るので、まったく不可能ではないけど、操作できません。
 手元の .NET 実行ファイルに適用してみましたが、ファイルの更新日時は変わりましたが、何が変わったのか、判別することは出来ませんでした(バイナリ エディタが無いので)。

引用:

C#やVB.netでは、ビルドのコマンド引数ではプロジェクトモデルの拡張機能の設定が出来ないためマクロを使用してコードから設定することで可能になると思っておりました。


その判断の基にしているドキュメントは、「Visual C++ 機能拡張オブジェクト モデル > Visual C++ プロジェクト モデル」の下にある、つまり、VC++ プロジェクトに対する説明なわけですね。では、C++ に対する設定が C# や VB.NET に適用できると判断する根拠は、どこにあるのでしょう?
 「Visual Basic、Visual C#、および Visual C# プロジェクトの機能拡張オブジェクト モデル」というカテゴリもあるのですが、その下には同様な記述はないようです。また、VS に付属の言語の中で、VC++ だけが特別扱いされていることも、気をつけてください。
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 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 ]

スキルアップ/キャリアアップ(JOB@IT)