2017-05-06 6 views
0

ドットネットフレームワーク3.5上に構築されたクラスライブラリプロジェクトが1つあります。私は最初のプロジェクトで作成されたDLLを新しいドットネットコアアプリケーションで参照し、そのライブラリからクラスを拡張したいと考えています。C#ドットネットコア拡張クラスネットフレームワークDLL

Microsoft.NETCore.Portable.Compatibilityへのナゲットリファレンスを追加して、いくつかの基本的な問題を修正する必要がありましたが、今では抽象メソッドでクラスを拡張するとメソッドをオーバーライドできません。クラスがメソッドを実装していないというエラーが発生し、オーバーライドするものがないというエラーが発生する逆説的な状況が発生します。

これを回避する方法はありますか、ドットネットコアではまったくサポートされていませんか?

基底クラス(ドットネットフレームワーク3.5クラスライブラリ):

public abstract class Server { 
    public event Action<Connection> ConnectionEstablished; 

    private TcpListener m_listenSocket; 
    private Task m_awaitConnectionTask; 
    readonly private List<Action> m_serverStoppedCallbacks = new List<Action>(); 

    protected Server(int port) { 
     m_listenSocket = new TcpListener(IPAddress.Parse("localhost"), port); 
    } 

    public void Listen() { 
     m_listenSocket.Start(); 
     m_awaitConnectionTask = new Task(AwaitConnection); 
    } 

    public void WhenStopped(Action callback) { 
     lock(m_serverStoppedCallbacks) 
      m_serverStoppedCallbacks.Add(callback); 
    } 

    protected abstract Connection CreateConnection(TcpClient tcpClient); 

    private void AwaitConnection() { 
     try { 
      while (true) 
       ConnectionEstablished?.Invoke(CreateConnection(m_listenSocket.AcceptTcpClient())); 
     } catch (SocketException e) { 

     } finally { 
      m_listenSocket.Stop(); 
      List<Action> callbacks; 
      lock (m_serverStoppedCallbacks) { 
       callbacks = m_serverStoppedCallbacks.ToList(); 
       m_serverStoppedCallbacks.Clear(); 
      } 
      foreach (var callback in callbacks) 
       callback(); 
     } 
    } 
} 

クラスを継承(正味コアコマンドラインアプリケーションをドット):

public class Server : Communism.Network.Server { 
    public Server(int port) : base(port) { 
    } 

    public static void Main() { 

    } 

    protected override Connection CreateConnection(TcpClient tcpClient) { 
     return null; 
    } 
} 

問題は、によって引き起こされているより多くの調査の後TcpClientタイプ。私がCreateConnectionのシグネチャをパラメータなしにしたり、型でビルドしても、私はうまく拡張できます。互換性パッケージは、ライブラリがコンパイルされたTcpClientクラスとは異なるTcpClientクラスを解決するためです。 Compatibilityパッケージがこれに対する解決策を見つけ出すためにどのように機能するかについて私は十分に分かりません。

ここには、同じエラーが発生するようにすべてのプロジェクトを設定した完全なリポジトリがあります。 VSは、バイナリの古いバージョンを使用しているときだけで2017 https://github.com/strigonLeader/dotnetcoreexample

+1

間違いなく公的な方法ですか?問題を示す最小限の例を投稿できますか? –

+0

保護されたレベルのアクセスでクラスを拡張することができる別の.net 3.5プロジェクトがあります – HonestHeuristic

+1

画像の代わりにコードのテキストを投稿します –

答えて

0

Visual Studioでソリューションを開き、私はこのような何かが起こる見てきただけです。私は解決策を忘れてしまったので、VSが何か問題を抱えてリファレンスを見つけて、それが第9層の地獄で見つかったコピーに自動的に解決したので、前にそれを焼いた。 2つのクラスが異なるプロジェクトにある場合、同じフレームワークをターゲットにしているかどうかを確認することもできます。

+0

2つのクラスは異なるプロジェクトにあります。ユースケースです。 1つはドットネットコア実行可能ファイルにあり、もう1つはドットネットフレームワークライブラリにあります。私は、ライブラリをインクルードし、そのクラスを実行可能ファイルに拡張したいと思います。 – HonestHeuristic