0

Windows 7 (64) での VS2008 の VB:

DesignMode で予期しない時間にコンポーネントのプロパティの値を変更する必要があり、(外部ファイルにシリアル化するのではなく) VS コンパイルの結果として得られる実行可能ファイルに、以前は不明だった新しい値を埋め込む必要があります。

テキスト編集に頼って、ビルド前のイベント ハンドラーで自動生成されたコンポーネントの初期化コードに新しい値を交換しました。これは問題なく動作しますが、私の好みでは少しハックです。VSにそのテキストを強制的に更新させる代わりの方法はありますか?

4

1 に答える 1

0

運が良かったので、コンポーネントのランタイム インスタンスの初期化コードを VS に強制的に自動生成させるように機能するように見えるものを見つけました。実行時に最新の designtime BackgroundImage ビットマップを使用します (ビットマップ内の Property 値を非表示にするだけで済みます。これは、GetPixel と SetPixel を使用してルール内で完全に行うことができます)。機能し、理にかなっています(ただし、「理由」については完全にFoSかもしれません。よく知っている場合は、教えてください):

私が理解しているように、コンポーネントが VS のデザイン サーフェイスにドロップされた直後 (およびコンポーネント トレイにレンダリングされる前) に、Visual Studio はそれをコンテナーに属するコンポーネントのコレクションに追加します。コンテナのコレクションにそれを追加することは、実行時にコンポーネントのルートに使用される Init プロシージャの Visual Studio の自動再生成を含む一連の出来事の 1 つのステップであり、コンポーネントのパブリック プロパティの値が含まれます。コンポーネントの Set Site プロシージャをオーバーロードし (ISite の作成はそのシーケンスの初期段階です)、オーバーロードでそのパブリック プロパティの 1 つに値を設定すると、その値が自動再生成テキストに表示されます。. これは、VS が Set Site を呼び出したときにのみ機能し、選択したときにいつでも実行する必要があることを除いて、ほとんど私が望んでいたことです。

次にチラシを取り、問題のプロパティ値を設定する UI で (いつの間にか)、コンテナのコレクションからコンポーネントを削除してから再度追加するコードを追加しました。 VS が再び Init コードを自動再生成することにつながる出来事のシーケンス。今回はプロパティの新しい値を使用します。どうやらそうでした。わーい。

コンポーネントをコンテナのコンポーネント コレクションに再追加するタイミングを決定することで、自動生成された初期化テキストに、そのコンポーネントのパブリック プロパティに割り当てた値を VS に強制的に書き込むことができるようになりました。それはコンパイルされます。

この手法は、Microsoft が自動生成を実装する (文書化されていない) 方法の変更に対して脆弱であり、間違いなくハックです。ただし、文書化された機能でさえ変更される可能性があります。下位互換性は良いアイデアですが、時にはそれが道を譲らなければなりません。そして、配達は必須です。あなたのコードが VS の将来のどのバージョンでも引き続き有効であることを知っておくとよいでしょう。

もちろん、文書化された機能は一般に、文書化されていない機能よりも変更される可能性が低くなります。しかし、 Property のすべての初期値が設定されたの自動生成のロジックは非常に説得力があります。マイクロソフトが後で同じシーケンスを使用することは本質的に論理的ではありませんが、別の方法で行うと、明らかな利益が得られずにマイクロソフトの費用がかかります. そして、Microsoft とその同類 (法的に義務付けられている) は、収益に基づいて決定を下します。したがって、現状は良い賭けのように思えます。

于 2013-07-16T15:43:37.077 に答える