問題タブ [ildasm]
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# - タイプのインスタンスを保存不可にする
- タイプのインスタンスをフィールドに格納できないようにタイプ (またはさらに良い場合はインターフェイス) をマークする方法はありますか (および と同様の方法
TypedReference
でArgIterator
)。 - 同様に、インスタンスが匿名メソッドを介して渡されるのを防ぐ方法はありますか?また、一般に、上記の 2 つのタイプの動作を模倣する方法はありますか?
- これは ILDasm を介して、またはより一般的には IL 編集を介して行うことができますか? UnconstrainedMelodyは、コンパイルされたアセンブリのバイナリ編集によって通常は得られない結果を達成するため、同じアプローチで特定の型 (または、より適切には、抽象型またはマーカー インターフェイス) を「マーク」する方法があるかもしれません。
エラーCS0610のドキュメントには次のように記載されているため、コンパイラにハードコードされているとは思えません。
フィールドまたはプロパティとして使用できないタイプがいくつかあります。これらのタイプには...
私の意見では、これらのような型のセットを拡張できることを示唆していますが、間違っている可能性があります。
私はSOについて少し検索しましたが、プログラムでコンパイラエラーをスローすることはできないことを理解していますが、特定の「特別な」タイプの動作を複製できないことを示すソースは見つかりませんでした.
質問の大部分が学術的なものであっても、回答にはいくつかの用途がある可能性があります。たとえば、特定のオブジェクトの有効期間が、それを作成するメソッド ブロックに制限されていることを確認すると便利な場合があります。
EDIT: RuntimeArgumentHandle
もう1つの(言及されていない)保存不可能なタイプです。
EDIT 2:それが何らかの用途に使用できる場合、コンパイラだけでなく、CLRもこれらのタイプを別の方法で扱うようです(タイプが他のタイプとまったく変わらないと仮定しています)。たとえば、次のプログラムは、関連をスローしTypeLoadException
ますTypedReference*
。短くするために調整しましたが、必要に応じて回避できます。たとえば、ポインターの型を変更してもvoid*
、例外はスローされません。
.net - 参照されたアセンブリのダンプ
参照されたアセンブリだけをダンプする ILDASM のコマンド ライン オプションはどれですか? 不可能な場合は、参照アセンブリを .NET DLL にダンプする別のツール/方法があります。
ilasm - ILASM は混合モード アプリケーションで動作しますか?
サードパーティの dll のメソッドを変更しようとしています
- ILDASM を使用して IL を生成する
- IL メソッドの変更
- ILASM を使用して DLL を生成する (失敗)
このエラーの原因は、サードパーティの dll にアンマネージ コードが含まれていることがわかりました。私が成功できる方法はありますか?
c# - {dll} によってインポートされたプロシージャをロードできませんでした
マネージ C++ dll にリンクする必要があるいくつかのアンマネージ C++ で記述された lib ファイルがあります。
次に、このマネージ C++ の関数を C# アプリケーションから呼び出す必要があります。
最初のステップは問題ありません - Managed C++ dll が作成されました。必要な関数がエクスポートされていることを ildasm で確認できます。ただし、C# で記述したテスト アプリからこの関数を呼び出そうとすると、次のように表示されます。
タイプ 'System.IO.FileLoadException' の未処理の例外が不明なモジュールで発生しました。
{MyManagedCPP.dll} によってインポートされたプロシージャをロードできませんでした。
このメッセージは VS2010 から送信されます。
簡単な実験を行いました - Managed C++ dll のすべての lib ファイルから依存関係を削除し、再構築しました。
この変更で問題ありません。アプリが起動し、C# テスト アプリから Managed C++ dll の関数を呼び出すことができます。
dll が lib ファイルと静的にリンクしている場合、マネージ C++ 関数を呼び出すことは設計上不可能ですか? 技術制限?または、いくつかの回避策がありますか?
ありがとう
reflection.emit - .locals init の角括弧の CLR IL の重要性
.NET で Reflection & Emit を使用して動的アセンブリを生成しようとしています。「共通言語ランタイムが無効なプログラムを検出しました」というエラーが表示されます。ハードコーディングされた型を使用して、必要な機能を持つ別のプログラムを作成しました。私が書こうとしている機能は、最終的には動的な型を使用しますが、ILDasm を使用して、生成する必要がある IL を確認できます。生成している IL とコンパイラが生成する IL を比較しています。あるメソッドの .locals init 宣言で、コンパイラによって生成されたコードに余分な項目があることがわかります。
コンパイラ生成:
私の:
コンパイラで生成されたコードの "[0]" と "[1]" の意味がわかりません。誰がそれが何を意味するのか教えてもらえますか?
より一般的な質問として、ほとんどの ILDasm 出力を問題なく追跡できます。しかし、時折、問題のある表現に出くわします。たとえば、ILDasm のこの行では
「!!0」はおそらくEntity<>のジェネリック型を指していますが、確かなことはわかりません.ILDasm出力にキーがあり、そのよりあいまいな出力を説明してくれるのではないかと思います。
c# - C# のクラスの既定のアクセス修飾子
C# のクラスの既定のアクセス修飾子は internal です。しかし、ildasm でクラスを検査すると、クラスがプライベートとして表示されます。
理由はありますか?