Serviceを読んで理解し、同意したものとみなします。VBが機能的に大きく劣っていた期間があり、VB.NETを利用していた企業もC#に流れたのもこの頃という印象です。両言語機能は当時導入されようとしてたLINQやLINQベースのORMに欠かせないものであり、VB.NETでは最新技術を生かせないという状況がしばらく続いていました。このギャップは.NET4.5までに徐々に解消するのですが、その間にC#側にdynamic機能が追加されたため、VBのメリットも失われてしまった格好です。ConnectかWindowsフィードバックに報告のうえ、修正されるまでは自分で回避するしかないと思います。原因を説明するとフォーム上にButton1を配置すると、.designer.vbに以下のようなコードが生成されます。このWithEventsフィールドはVB文法上はフィールド扱いですが、値の代入時にイベントハンドラーの設定が行われるため、内部的にはプロパティとなります。[クローズ済み]文法が分かりやすいかどうか、アプリケーションが開発しやすいかどうかは主観的な問題ですので置いておきます。C#とVB.netは機能的に大きな差があるわけではありません。言語の人気に大きな差がありますので、わざわざ人気がなく情報量の少ないVB.netを選ぶ理由があまりないと言えます。いうことになると思います。[クローズ済み]もうちょっと低いレベルの話題を出しておきます。個人的には、変数スコープの違いが言語の違いを作っているのではと考えています。従来C言語では変数をスコープの先頭に記述する制限がありました。その制限を何をどう勘違いしたのか関数の先頭と思い込み、結果、C言語や(元より制限のない)C++言語において関数の先頭にずらずらと変数を並べるスタイルのソースコードをちょくちょく見かけます。仕様をきちんと理解している人から見ると「わかってない人が書いているな」とそのソースを避けたくも思うはずです。スコープの概念そのものはとても重要でJavaScriptのようにブロックスコープが存在しない場合、強引な手を使ってでもスコープを実現するわけですし。個の銅バッジ6VBで起動したDOSプロンプトに表示されているテキスト(表示内容)の取得方法まず、テキストをどう保持してどう描画するかはアプリケーションによって様々ですから、「ウィンドウハンドルを渡せばウィンドウに表示されているテキストを取り出せる」といった汎用的なAPIは存在しません。はじめとするコンソールアプリケーションの場合、例のウィンドウはWindowsが管理しているのでコンソールに表示されている文字を読み取るAPIもあります。個の銅バッジ6ウィンドウズフォームアプリケーションから対話型コンソールアプリケーションを操作する為の実装についてp.StandardOutput.Read(およびReadLine)メソッドは実際に入力(外部プロセスから見れば出力)があるまで現在のスレッドをブロックしてしまうので、フォームアプリ等のメインスレッドで使用してはいけません。非同期に読み込みを行うにはReadAsyncメソッドを使ったり、別スレッドを起こしてRead/ReadLineしたりといった方法がありますが、手軽なのはBeginOutputReadLineを使ってイベントとして入力を受け取ることかと思います。下記コードで入出力はできることは確認しました。それと、VB.NETにおいて"\r\n"は改行コードを意味しません。文字通り\r\nという文字列を書き込んでいるだけになってますのでそこも修正しています。以下のようにPropertyDescriptorをPropertyGridから要求されても渡さないようにすれば表示されないようにできます。プロパティへのアクセスがPropertyDescriptor経由であることを利用すれば、全く異なるオブジェクトのプロパティを表示させることも可能です。これらの方法を使うことで、元のオブジェクトに手を加えること無しに表示/非表示を変更できるようになります。個の銅バッジ4ウィンドウズフォームアプリケーションから対話型コンソールアプリケーションを操作するには?まず.NETで外部プロセスを起動する場合System.Diagnostics.Process型を使用します。この際にプロセスにパラメーターを渡す手段としては2つの方法があります。1個はコマンドライン引数です。fugaと入力した場合と同等の動作となります。コマンドライン引数ではなく、起動後に入力を求められるタイプのプロセスとは標準入力で通信します。個の銅バッジ4テキストボックス上に透明のピクチャーボックスを重ねて表示したいPictureBoxを使わずにWndProcをオーバーライドしてWM_PAINTメッセージで自前で画像を描画を行うと重ね描きが可能です。[クローズ済み]現実問題としてC#で開発されたプロジェクトや資産が多く、またC#を理解できる人間が多いというのが表向きの理由かと思います。C#のほうが人気なのかという部分についてですが、これは客観的な理由よりも主観的な理由の方が大きい気がします。Serverを利用したWebアプリケーションの開発では、C#の採用数がVB.NETに比べるととても多いです。いった理由、あるいは暗黙の了解的なものでC#が選択されています。XMLならどう書くのでしょうか?XPathの//はXLINQのDescendants拡張メソッドに対応します。この場合はXML名前空間が設定されているのでXNameを明示的に作成する必要があります。[]にはLINQのWhereを使用し、XElement.Attributeメソッドで属性を取得します。BasicではXML対応しているため、別の記述が可能です。XML名前空間についてはImport構文で指定可能です。次に//xhtml:tableについてはXML子孫軸プロパティで指定可能です。'o1']についてはWhereを使えますがその際XML属性軸プロパティが使えます。個の銅バッジ3Stringの連結時のOutOfMemoryExceptionを回避する方法yhataさんの指摘も踏まえて回答を改めます。String結合を無制限に繰り返すことが原因でOutOfMemoryExceptionが発生する場合ですが、例外が表しているようにメモリ不足の可能性があります。32bitアプリケーションでは2GBのメモリを使用できますが、その全てがデータに使えるわけではないため、それよりも少ない使用量でもOutOfMemoryExceptionが発生します。Stringの代わりにStringBuilderを使用することで処理速度は向上しますが、処理可能なデータ量はほぼほぼ改善されません。結局、処理方法を抜本的に見直す必要があります。少なくともString結合を無制限に繰り返すことはできません。「String文字列の連結にはStringBuilderを使うのがいいですよ」と回答を書こうとしてコード例を作ったところ、件数が多すぎてStringBuilderを使ってもOutofMemoryExceptionが出てしまいました。件数が多くてメモリ上で全件を処理できない場合、行ごとに処理をするよう発想を変えるのがベターだと思います。この方法なら数100万件を超えても、ディスク容量の許す限りエラーにはなりません。※分散処理でDBにでも格納するのがベストかもしれませんが、環境のセットアップなどが必要になるためここでは扱いません。いうファイルを一時的に書き出して、各行ごとに処理してからファイルを消すサンプルコードです。アプリケーションを開発しやすいのもVB.NETだと勝手に思っています。VBとVB.NETは別物です。世の中に多く存在するであろうC/C++/Javaなどの開発者にとってC#の方がとっつきやすいと思います。(1)VB.NET登場時、旧VBとの言語的な差が大きく、どうせ覚えるなら.Netのために新しく作られてオープンな規格であるC#を勉強した方がいいよね、という流れになった。当時VBが流行っていたのは、プログラミングスキルの低い人でもGUIアプリケーションを簡単に作れる、Microsoft製言語というのが理由だと思います。[クローズ済み]技術的な回答は多く出ているので、人的リソースの視点で書かせて頂きます。VB6→VB.NETの移行期に活躍したプログラマーは現在既にいいお年で、新たにC#を習得させるコストを払うより現状維持または職種変更してもらい、C#erは外から調達する企業が多いのではないでしょうか。一部の優秀なプログラマーは除外しますが、日本の人月ビジネスが消費してきた「コーダー」については上記のことが言えると思います。ように)標準ライブラリにはコマンドラインオプションを解析するものはまだなかったと思います(一度間違ってCTPに登場したことがありましたが)。GetOptの.NET版を含め有志で作成されたライブラリがいくつか公開されています。あり、nuGetでも検索するといくつか出てきますね。nuGetからもインストールできそうです(公開しているのは作者自身ではないみたいですが)。個の銅バッジ2【.NetFramework4.0】コンテキストメニューの子アイテムがクリックされた事を検知したいAddHandlerステートメントを使って動的に生成するタイミングでToolStripMenuItemにイベントハンドラーを追加すればよいです。個の銅バッジ2クリスタルレポートの書式設定の仕方レポートデザイナでIFieldObjectを選択し、プロパティウィンドウでRoundingTypeプロパティをcrRoundToTenth(十分の1)にします。ついでに表示される小数点以下の桁数を変更する場合はDecimalPlacesプロパティで変更できます。コードで変更する場合は以下のようにできます。個の銅バッジ2クラス内に存在するロギング用の記述について.NETであれば、PostSharpはいかがでしょうか。products?」)で使えます。無料版は機能制限がありますが、ログ出力であれば十分だと思います。MyLogging属性はPostSharpのライブラリにあるクラスを継承して自分で作ります。接続情報は、アプリケーションには必要ですが利用者には見せたくありません。ServerであればSqlConnectionクラスなど)を使うと思いますが、デバッガーをアタッチしブレークポイントを置いてConnectionStringプロパティを参照してしまえば、復号された接続情報を読むことができます。DBの接続情報に限らず、いかなる暗号化もこの方法には無力です。デバッガーのアタッチを拒否する等の特殊な対策もあるかもしれませんが、結局はイタチゴッコでしかありません。個の銅バッジ2言語の優位性について他の方もコメントされていますが、メンバーの経験を優先した方がいいとは思います。40人となるとまとまらないかもしれませんね。その上で、「言語の優位性について」答えてみたいと思います。プログラミングでは一般的に式;expressionと文;statementとがあります。Basicはご存知のように構文が冗長です。C#言語であれば式でシンプルに記述できるような内容が、冗長が故に文で記述する必要が出てきたりもします。1なら文として完結させてしまうでしょう。C#言語の方が開発が活発です。Messageひとつで完了するような単純なものではありません。Altなどのキーの状態管理などいろいろな操作が必要です。ネイティブコードであればSendInputを使用しますが、.NETであればSendKeys.SendWaitが用意されているのでこちらを使うのが楽でしょう。その際、Enterキーについては{ENTER}と記述するなど、特殊キーの扱いについてはSendKeysクラスの解説を参照してください。個の銅バッジ1他アプリケーションが受信するウインドウメッセージの取得方法について一般論としてはSetWindowsHookExでフック可能です。Basic.NETでSetWindowsHookExを呼び出す場合、VBではネイティブDLLを作成することが出来ませんので、引数として指定できるのは低レベルフックのWH_KEYBOARD_LLとWH_MOUSE_LLに限られます。メッセージをすべてフックするような純.NETアプリの実装は不可能だと思います。個の銅バッジ1Ribbonコントロールに動的にボタンを追加したいVSTOのリボンには読み取り専用になるプロパティがいくつか存在します。Items自体は記載されていませんが、GroupsやTabsなどの他のコレクションプロパティが指定されているので同様の仕様なのだと思われます。ボタンイベントに応じて項目を増減させたい場合、ボタンの追加は諦めてリンク先に記載のあるDynamicプロパティをTrueに設定したRibbonMenuで妥協するしかないと思われます。ボタンの追加タイミングが起動時だけでよいのであればRibbon1のコンストラクターではまだ読み取り専用となっていないので変更が可能です。自分でコマンドプロンプトを起動して希望する動作をさせる、ほうが圧倒的に簡単ですよ。