Package コンストラクターで、OnStartupComplete イベントのイベント ハンドラーを追加しました。しかし、コードを実行すると、イベント ハンドラーが呼び出されません。私は何を間違っていますか?
3 に答える
DTEEvents
オブジェクトへの明示的な参照を保持しない限り、VS には (イベント ハンドラーを使用して) オブジェクトをリサイクルするバグがあります。次のようなものが必要です。
[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
class MyPackage : Package
{
DTEEvents _EventsObj;
protected override void Initialize()
{
var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE));
_EventsObj = dte.Events.DTEEvents;
_EventsObj.OnStartupComplete += OnStartupComplete;
}
void OnStartupComplete()
{
}
}
ここで私の答えを参照してください: http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/eb1e8fd1-32ad-498c-98e9-25ee3da71004
イベント サブスクリプションを実行する前に、DTE オブジェクトのボックス化とボックス化解除を行っている可能性があるためだと思います。これは非常に厄介であり、イベント サブスクリプションの目的でサービス ロケーションを介して DTE オブジェクトを簡単に渡すことができないことは非常に驚くべきことです。しかし、これが犯人のようです。
DTE オブジェクトへの参照を維持しようとしましたが、とにかくそうしていたので違いはありませんでした。機能するイベントもあれば、機能しないイベントもあります。しかし、これは一貫しています。
コードをパッケージ コンストラクターからパッケージの Initialize() メソッドに移動してみてください。役立つはずですが、そうでない場合は、他の UICONTEXT_ をテストしてください。AutoLoad属性の値、おそらくUICONTEXT_NoSolution ?