1

Windows Update Agent APIの非同期ダウンロード/インストール メソッドを実装しようとしていますが、コールバック クラス (IInstallationProgressChangedCallbackなど)の実装に問題があります。

System を使用して機能しない実装クラスの例を次に示します。WUApiLib を使用します。

namespace ConsoleApplication1
{
    class DownloadProgressCallback : IDownloadProgressChangedCallback
    {
        public override void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs callbackArgs)
        {
            Console.WriteLine("Do something");
        }
    }
}

このクラスを含むプロジェクトをコンパイルしようとすると、

ConsoleApplication1.DownloadProgressCallback.Invoke(WUApiLib.IDownloadJob, WUApiLib.IDownloadProgressChangedCallbackArgs)': no suitable method found to override

参考までに、インターフェイスの定義方法 (メタデータ) を次に示します。

#region Assembly Interop.WUApiLib.dll, v2.0.50727
// F:\src\ConsoleApplication1\ConsoleApplication1\obj\x86\Debug\Interop.WUApiLib.dll
#endregion

namespace WUApiLib
{
    [InterfaceType(1)]
    [Guid("8C3F1CDD-6173-4591-AEBD-A56A53CA77C1")]
    [TypeLibType(384)]
    public interface IDownloadProgressChangedCallback
    {
        void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs callbackArgs);
    }
}

私は COM/Interop にあまり詳しくないので、ここで何が間違っているのかわかりません。

4

1 に答える 1

3

overrideインターフェイスを実装するときに使用する必要はありません。書くだけ:

    public void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs callbackArgs)
    {
       Console.WriteLine("Do something");
    }

このoverrideキーワードは、基本クラスから継承し、継承された基本クラスの仮想 (または抽象) メソッドを「オーバーライド」するときに使用されます。詳細については、オーバーライドを参照してください。

インターフェイスを使用すると、必要なのはマッチング メソッドだけです。インターフェイスを明示的に実装することもできます。

void IDownloadProgressChangedCallback.Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs args)
{ //...

これにより、クラスのパブリック API を「汚染」しない方法でインターフェイスを実装したり、同じ名前と型を持つメンバーを持つ 2 つのインターフェイスに異なる実装を提供したりできます。

于 2012-06-19T01:18:22.813 に答える