問題タブ [codedom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - csc.exeでスタックオーバーフロー(CS1647)を引き起こすC#CodeDomの回避策?
大きな文字列constを持つクラスを生成する必要がある状況があります。私の制御外のコードにより、生成されたCodeDomツリーがC#ソースに発行され、後でより大きなアセンブリの一部としてコンパイルされます。
残念ながら、この文字列の長さがWin2K8 x64では335440文字(Win2K3 x86では926240文字)を超えると、C#コンパイラが致命的なエラーで終了するという状況に遭遇しました。
MSDNによると、CS1647は「コンパイラのスタックオーバーフロー」です(しゃれは意図されていません!)。もっと詳しく見てみると、CodeDomは文字列constを80文字で「うまく」ラップしていると判断しました。これにより、コンパイラは4193文字列チャンクを連結します。これは明らかにx64 NetFxのC#コンパイラのスタック深度です。CSC.exeは、この式を内部的に再帰的に評価して、単一の文字列を「再水和」する必要があります。
私の最初の質問はこれです:「コードジェネレーターが文字列を出力する方法を変更するための回避策を知っている人はいますか?」外部システムがC#ソースを中間として使用するという事実を制御できず、これを定数にしたい(むしろ文字列の実行時の連結よりも)。
あるいは、特定の文字数の後でも定数を作成できるが、複数の大きなチャンクで構成されるように、この式をどのように定式化できますか?
完全な再現はここにあります:
codedom - CodeDOM による変数名の生成
こんにちは、みんな、
これで私を助けてください:
カスタム コントロールを含むフォームがあります。
カスタム コントロールには、データを取得するために同じ DataSource を参照する 2 つのコレクションがあります。
私の現在の CodeDOM シリアライザは次のように動作しています:
ご覧のとおり、objA は 2 回インスタンス化されています。
これを解決するには?
objA への参照を保持する変数を宣言し、その変数を 2 つのコレクションに割り当てることができると思います。
しかし、「var」が一意の名前であることを保証できません。Form がコントロールに付けた正確な名前 (control1、control2 など) を自動的に割り当てるにはどうすればよいですか?
ありがとうございました。
c# - C#メソッドの文字列表現
.NET 3.0(またはそれ以前)でメソッドの文字列表現を取得する方法はありますか?MethodBodyオブジェクトからILバイト配列を取得できることは知っていますが、VSで目に見えるように、メソッド本体を本質的に表す文字列を取得することに興味があります。
実行時にメソッドをCodeMemberMethodsに変換する方法があるかどうかを確認するために、CodeDom名前空間を調べましたが、これまでのところ乾燥しています。
何かご意見は?
c# - C# 4.0、メソッドが欠落しているかどうかを検出
LinePragmas を CodeDom オブジェクトに追加したい状況があります。ただし、一部のコード DOM オブジェクトには LinePragma プロパティがあり、一部にはありません。
したがって、 dynamic キーワードを使用して、プロパティがオブジェクトに存在するかどうかを (例外をスローせずに) 検出し、存在する場合はプラグマを追加できるかどうか疑問に思っています。これが私の現在の方法です:
更新: 私が行った解決策は、Exists() という拡張メソッドを追加することでした。これについてのブログ投稿をここに書きました: Member Exists Dynamic C# 4.0
要点は、DynamicObject の TryGetMember を実装したオブジェクトを返す拡張メソッドを作成することでした。リフレクションを使用して、true または false を返します。これにより、次のようなコードを記述できます。
.net - CodeDom Visual Basic .NET パーサーは存在しますか?
誰かが Visual Basic パーサーを CodeDom に作成したかどうかを知っていますか (つまり、VB.NET を入力として取り、CodeCompileUnit グラフを作成します)。
解決
SharpDevelopのソース コードを取得し、そのパーサーを使用しました。問題なく動作します。
c# - CodeDomを使用してコード構造を分析しますか?
私は最近、Stackoverflowに投稿を書き、メトリックを計算するいくつかのC#ライブラリ、主にCCを要求しました...残念ながら成功しませんでした。だから私はそれを自分で書くつもりです。私はウェブ上で最善のアプローチを検索しましたが、始める前に、どのようにそれを行うかについてお聞きしたいと思います。
私は現在、2種類のアプローチの中間にいます
- ソースコードディレクトリを指定して、CCを計算できるようにするためのメソッド、条件文などの構造を識別するために、正規表現などを使用してソースコードを解析します。
- アセンブリが与えられたら、それをロードして分析します(CodeDomを使用しますか?)
ソースコードを直接解析することは私にとって良いアプローチではないように思われるので、私は2番目のアプローチに向いています。.Netフレームワークに統合されているCodeDomについて読みました。私はそれが動的コード生成に使用されることを知っています。コード構造の分析にも使えると思いますよね?誰かがCodeDomを使用するための良い出発点、いくつかのヒント、どこから始めるべきか良いチュートリアルを持っていますか?
ありがとう
編集:または、ソースコードを簡単に解析できる他のユーティリティ(DOMのような構造)。
c# - CodeDom を使用して配列の配列 (またはジャグ配列) を初期化する方法は?
CodeDomを使用して、次のことを行う C# (.Net 2.0) コードを生成しようとしています。
CodeDom では、配列の初期化にはCodeArrayCreateExpressionが必要です。MSDN は次のように述べています。
言語で配列の配列が許可されている場合は、CodeArrayCreateExpression 内に CodeArrayCreateExpression をネストすることでそれらを作成できます。
私の理解では、唯一の可能性は次のように書くことです:
しかし、これはこれを生成します:
それは完璧ではありませんが、生成時に myArray のサイズを知っていれば、それを行うことができます。
初期化を行う関数を作成して CodeDom で呼び出すこともできますが、純粋な CodeDom でそれを実行できればさらに便利です。私は何か見落としてますか ?
[編集] 背景情報
アイデアは、2 つのオブジェクト表現間のアダプターを自動的に生成することです。「int [] [] 型のフィールドを持つコンテナ オブジェクトがあります」というメタ記述 (ある種の IDL) と、このコンテナの 2 つの表現があります。
したがって、任意のサイズの配列に適応できるコードを生成するという問題があります。
c# - コードの生成時に EnvDTE と CodeDom の間に違いはありますか
私は DSL を使用していくつかの CS クラスを生成して読み取る必要があり、EnvDTE を使用して CS ファイルを読み取る方法を 1 つ採用し、同僚は CodeDom を使用して CS ファイルを生成しました。
それはただの砂糖ですか、それとも大きな違いがありますか...
と
私は主観的に EnvDTE を好みますが、「実際の」違いが何であるかはわかりません。
情報: C#、Visual Studio 2010