【问题标题】:C# dot net core extend class from net framework dllC# dot net core 从 net framework dll 扩展类
【发布时间】:2017-10-04 17:43:53
【问题描述】:

我有一个基于 dot net framework 3.5 的类库项目。我想让一个新的 dot net core 应用程序引用第一个项目生成的 dll 并从该库扩展类。

我不得不添加对 Microsoft.NETCore.Portable.Compatibility 的 nuget 引用来解决一些基本问题,但是现在当我使用抽象方法扩展类时,我无法覆盖该方法。我遇到了一个自相矛盾的情况,即类引发了一个方法未实现的错误,而该方法引发了一个没有什么可以覆盖的错误。

有没有办法解决这个问题,还是 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();
        }
    }
}

继承类(dot net core命令行应用):

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 类不同。我对 Compatibility 包的工作原理知之甚少,无法找到解决方案。

这是一个完整的存储库,其中设置了所有项目,因此您会遇到相同的错误。只需在 Visual Studio 2017 中打开解决方案。 https://github.com/strigonLeader/dotnetcoreexample

【问题讨论】:

  • 绝对是公共方法吗?你能发布一个最小的例子来说明这个问题吗?
  • 它是受保护的,我有另一个 .net 3.5 项目,我可以在其中使用受保护级别的访问权限很好地扩展类
  • 贴出代码的文字而不是图片
  • 那么您确定您使用的TcpClient 是来自正确命名空间的那个吗?这就是为什么一个完整的例子 - 包括 using 指令很重要。

标签: c# .net .net-core


【解决方案1】:

我见过这样的事情发生的唯一一次是当 VS 使用旧版本的二进制文件时。我之前一直被它烧死,因为我忘记清理解决方案,或者当 VS 遇到某种问题找到引用并自动解析到它在地狱第九层找到的副本时。如果这两个类位于不同的项目中,您可能还想查看是否针对相同的框架。

【讨论】:

  • 这两个类肯定在不同的项目中,这就是用例。一个在点网核心可执行文件上,另一个在点网框架库中。我想在可执行文件中包含该库并从中扩展一个类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2017-12-16
  • 2021-12-06
相关资源
最近更新 更多