2017-05-06 119 views
0

我有一個建立在網絡框架3.5的類庫項目。我想要一個新的dot net核心應用程序引用第一個項目生成的dll並從該庫中擴展類。從網絡框架DLL的C#點網絡核心擴展類

我不得不添加一個nuget引用到Microsoft.NETCore.Portable.Compatibility來解決這樣做的一些基本問題,但現在當我用抽象方法擴展一個類時,我無法重寫該方法。我得到了一個自相矛盾的情況,那就是類引發了一個錯誤,那就是該方法沒有被實現,並且該方法引發了一個錯誤,那就是沒有什麼可以重寫。

有沒有辦法解決這個問題,或者根本不支持dot net core?

基類(點淨框架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的簽名不帶參數或構建類型,我可以很好地擴展。這可能是因爲Compatibility包將TcpClient類解析爲與針對該庫編譯的TcpClient類不同。我對兼容性包的工作方式不太瞭解,無法找出解決方案。

下面是一個完整的存儲庫,其中包含所有項目,以便獲得相同的錯誤。只需在visual studio 2017中打開解決方案。 https://github.com/strigonLeader/dotnetcoreexample

+1

這絕對是一種公開的方法嗎?你能發表一個證明問題的簡單例子嗎? –

+0

它的保護,我有另一個.net 3.5項目,我可以延長保護級別訪問類罰款 – HonestHeuristic

+1

代碼的文本代替圖像 –

回答

0

我唯一見過這樣的事情發生在VS使用舊版本的二進制文件時。之前我被它燒過了,因爲我忘了清理解決方案,或者當VS遇到某種問題時找到一個引用,並自動解析爲它在第九層地獄中找到的副本。如果這兩個類在不同的項目中,您可能也想看看您是否針對相同的框架。

+0

這兩個類肯定在不同的項目中,那就是用例。一個是在dot net核心可執行文件中,另一個是在一個dot net framework庫中。我想包含該庫並在可執行文件中擴展一個類。 – HonestHeuristic