2017-05-06 80 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