モジュールinitializersクライアントまで、フルのC#
-
20-09-2019 - |
質問
モジュールinitializersの特徴でのCLRな利用にC#アプリケーションVB.NET.そのグローバルにおける静的メソッドの名前 .cctor
を作成する前に実行するその他のコード(タイプinitializers、静的コンストラクタ)による組み立てて実行されます。また、昨を使いたいというこのプロジェクト ハッキングと私の独自のソリューション(コンソールプログラム/msbuildタスク) 利用いただけます:standardとexpress。Cecilものかと思って:
必要があります。トのC#コンパイラへの発光モジュールintializers?他の属性(例えばCompilerGenerated,SpecialName又はその他のtrickeryことは何に使われるのでしょうか。
いはC#/VB.NET 初放これらのinitializers自身が一目的は?だからこそ見るものC++一部のinteropの目的が見られませんでしたが参考については、他の目的に使用するそのアイデア?
解決
いいえ、C#でそれらを放出する方法はありませんがグローバルである必要があります。
あなたはそれらを書くために別のツールを使用する必要があります、好ましくはIL-アセンブラます。
2番目の質問については、私は私が知らないことを認めざるを得ないが、私は任意のC#のによって生成された見たことがない、と私はかなり頻繁にILDASMを使用するので、私はそれが彼らを放出しないことを前提としています。
他のヒント
によって書かれた素晴らしいオープンソースIL-ウィーバープロジェクト「 fody を」、のモジュール初期化子アドオンをチェックサイモンCropp: https://github.com/fody/moduleinitする
それはあなたがfodyによって組み立て初期化子に翻訳される方法を指定することができます:
public static class ModuleInitializer
{
public static void Initialize()
{
//Init code
}
}
このを取得します:
static <Module>()
{
ModuleInitializer.Initialize();
}
たぶんSystem.Reflection.Emit
名前空間があなたを助けることができます。 MethodAttributes
列挙が同様の要素を(SpecialName, RTSpecialName)
が含まれています。
はEinar、 あなたの質問はすでにすでにコンパイルアセンブリにモジュール初期化子を注入することを可能にするツールを書いたように私には明確にしなかった。
http://einaregilsson.com/module-initializers-in-csharpする
私はあなたのアプリケーションを試してみましたが、それが完璧に動作します。 あなたが書いたように、2から4.5に、現在のすべてのフレームワークで動作するはずます。
私のために役に立たないあなたのソリューションを作る一つだけ問題があります: あなたの初期化子は、アプリケーションが最初のアセンブリで何かをアクセスしたときに呼び出されます。
私は必要なもの総会がプロセスにロードされたときにモジュール初期化子がすぐに呼ばれるべきであるということです。そうではありません。アプリケーションがアセンブリにアクセスしないのであれば、それが初期化されません。
一日調査した後、それはこれを取得する唯一の方法は、マネージC ++アセンブリを作成し、()のDllMain内のコードを実行することであると私には思える。
あなたは、静的コンストラクタまたはあなたが.cctorを放出する真の静的変数C#コンパイラにアクセスできるシングルトンクラスを持っている場合。