【问题标题】:Are .NET DLLs linked statically or dynamically?.NET DLL 是静态链接还是动态链接?
【发布时间】:2018-05-08 23:43:51
【问题描述】:

我对 C# 完全陌生,现在必须支持用 C# 编写的整个测试套件。 我在 Windows 2008 Server 上使用 Visual Studio 2013。

我的问题如下:

我有一个带有签名的类方法

public CommandInfo SetDns(String ipAdr1)

我将其更改为添加一个可选参数

public CommandInfo SetDns(String ipAdr1, String ipAdr2="")

我刚刚重建了这个 DLL,并认为引用这个的所有其他 DLL 都没有区别

但似乎较旧的 DLL 现在因错误而失败

System.MissingMethodException:找不到方法:'My.TestBeds.CommandInfo My.TestBeds.DDR.Net.SetDns(System.String)'。

我的查询:

  1. 这是预期的吗?我还要重建所有的 DLL 吗?

我遇到的麻烦是由于某些限制,我也必须签入 DLL。所以我只想重建和签入相关的:(

  1. 如果我还必须重建所有其他 dll,有没有办法知道哪些 DLL 有这个作为参考并需要重建?

【问题讨论】:

标签: c# dll optional-parameters


【解决方案1】:

是的,添加参数是一项重大更改,即使它是可选的。 IL 包含编译器解析的确切签名,而不仅仅是名称。在不影响兼容性的情况下实现此更改的典型方法是添加重载 - 例如:

public CommandInfo SetDns(string ipAdr1) { return SetDns(ipAdr1, ""); }
public CommandInfo SetDns(string ipAdr1, string ipAdr2) {...}

否则:是的,这是一个重大变化,您需要重建所有消费者。

【讨论】:

  • 什么是“IL”?有没有一种简单的方法可以吸引所有消费者?
  • @mittal IL 是“中间语言”;通常,.NET 语言(如 C#)编译为 IL,然后 JIT 编译为您实际运行它的机器上的机器代码。如果您熟悉 Java:IL 类似于 Java 字节码。
  • 啊!!好的。所以基本上我应该重写该方法而不是替换它。也许我可以把旧版本的方法留在那里,也可以添加新的?
  • @mittal 至于寻找所有消费者:我宁愿不首先引入重大更改,但是:最可靠的方法是重建所有内容,看看有什么问题:) 如果当然,您有自动构建...
  • @mittal 是的;这是非常常见的——但是通过转发它,就像我上面展示的那样,你只有一个版本的实际代码需要维护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多