1

だから、私は非常に単純な C#/.Net インターフェイスを持っています。ただし、このインターフェイスを WinRT に公開する必要があります。だから、現時点ではこれらのインターフェースを持っています

//.Net (in the `Common` namespace)
public interface IWriter
{
  void Write(string text);
}

//WinRT (in the `WinRT` namespace)
public interface IWriter
{
  void Write(string text);
}

IWriter : Common.IWriterWinRT に適した型を使用しているにもかかわらず、どうやらそれはうまくいきません。だから、今私は両方を実装する双方向ラッパーを書いています:

//WinRT
internal class WriterWrapper : Common.IWriter, IWriter
{
  Common.IWriter CommonWriter;
  IWriter WinRTWriter;
  public WriterWrapper(IWriter writer)
  {
    WinRTWriter=writer;
  }
  public WriterWrapper(Common.IWriter writer)
  {
    CommonWriter=writer;
  }
  void Common.IWriter.Write(string text)
  {
    if(WinRTWriter == null)
    {
      CommonWriter.Write(text);
    }else{
      WinRTWriter.Write(text);
    }
  }
  void IWriter.Write(string text)
  {
    ((Common.IWriter)this).Write(text);
  }
}

ただし、これは非常に醜く退屈です。また、必要な場所で使用すると、「無限」のオブジェクト グラフになります。

次のような .Net クラスがあるため、このインターフェイスが必要です。

//.Net (`Common` namespace)
public class Config
{
  public IWriter Writer{get;set;}
}

このプロパティを WinRT に公開する最善の方法は、このオブジェクトをラップすることです。

//WinRT
public class Config
{
  Common.Config CommonConfig;
  public Config()
  {
    CommonConfig=new Common.Config();
  }
  public IWriter Writer
  {
    get
    {
      return new WriterWrapper(CommonConfig.Writer);
    }
    set
    {
      CommonConfig.Writer=new WriterWrapper(value);
    }
  }
}

したがって、誰かが新しいオブジェクトにアクセスするたびにWinRT.Config.Writer、新しいオブジェクトが作成され、Config オブジェクトが範囲外になるまで解放されません。

どうすればこれを防ぐことができますか?これを行うための全体的なより良い方法はありますか?

4

0 に答える 0