0

VS アドインを VS パッケージに移植しています。パッケージが初期化されると、パッケージは OnBuildBegin と OnPublishBegin をサブスクライブします。Visual Studio は期待どおりに OnBuildBegin をトリガーしますが、OnPublishBegin は呼び出されません。

ほぼ同じコードが、Visual Studio 2013、2012、および 2010 でアドインとして機能します。しかし、VS パッケージとしての VS 2015 では、OnPublishBegin は機能していないようです。

サンプルコードは以下です。

実験モードで VS の 2 番目のインスタンスを開始するように構成されたデバッガーを実行しているコードをテストするには。2 番目のインスタンスでは、別のソリューションを開き、発行ウィザードを使用して発行します。

using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;

namespace MyPackage
{
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] // Info on this package for Help/About
    [Guid(VSPackage.PackageGuidString)]
    [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")]
    [ProvideAutoLoad(UIContextGuids80.SolutionBuilding)]
    public sealed class VSPackage : Package
    {
        public const string PackageGuidString = "a8ddf848-00ea-4e4e-b11a-65663a8a8021";

        private DTE2 application;
        public VSPackage()
        {
        }

        protected override void Initialize()
        {
            base.Initialize();
            this.application = (DTE2) this.GetService(typeof(DTE));

            ((Events2)this.application.Events).BuildEvents.OnBuildBegin += this.OnBuildBegin;
            ((Events2)this.application.Events).PublishEvents.OnPublishBegin += this.OnPublishBegin;
        }

        private void OnBuildBegin(vsBuildScope scope, vsBuildAction action)
        {
            MessageBox.Show("OnBuildBegin");
        }

        private void OnPublishBegin(ref bool pubContinue)
        {
            MessageBox.Show("OnPublishBegin");
        }
    }
}

誰かが私のために問題に光を当てることができますか?

4

1 に答える 1

1

Events オブジェクトへの参照を保持して、GC から保護することを強くお勧めします。

protected override void Initialize()
{
    events = application.Events;
    buildEvents = events.BuildEvents;
    publishEvents = events.PublishEvents;
    buildEvents.OnBuildBegin += this.OnBuildBegin;
    publishEvents.OnPublishBegin += this.OnPublishBegin;
}

private Events2 events;
private BuildEvents buildEvents;
private PublishEvents publishEvents;
于 2015-09-16T05:44:31.670 に答える