【问题标题】:System.MissingMethodException after adding an optional parameter添加可选参数后的 System.MissingMethodException
【发布时间】:2012-04-10 16:43:14
【问题描述】:

当我在一个组件中有一个可选参数并且调用它的另一个组件没有构建时,我收到 System.MissingMethodException 错误,因为它使用旧数量的参数调用它。

只有添加了参数的组件才会构建为补丁部署。调用组件是旧的,因为它没有任何变化。

调用组件运行时报错:

异常信息

异常类型:System.MissingMethodException 消息:方法不是 找到:'标签网址 IPSD.BnB.Transaction.Postage.GetLabelURLs(System.String)'。数据: System.Collections.ListDictionaryInternal TargetSite:无效 GenerateScanForm(Int32, Int32) HelpLink: NULL Source: BnBDispenseQueueProcess

据我所知,它不应该引发错误,因为新参数是可选的。 另一件事调用组件(EXE)作为 Windows 服务运行。

我们找到了一个非常简单的解决方法来让它运行。通过删除更改的组件一次并运行调用组件,它会说找不到 DLL。再次放置相同的 DLL 并调用组件工作正常:)。

我认为我缺少 .net 的一些内部结构。

如果需要更多信息,请告诉我。

【问题讨论】:

  • 我们将可选参数添加到我们的常用库之一。这破坏了所有正在运行的模块(我们很幸运,它正在测试环境中)。这些都是 .net 的花哨的开发时间特性,看来我们在使用它之前必须深入了解它们。感谢您提出这个问题。
  • @CreativeManix 请告诉我您的发现。因为无法完全理解它为什么会这样。可能是幕后发生的一些编译技巧
  • @Sanddep 正如 Jon Skeet 所提到的,可选参数是编译时特性。在调用程序程序集的编译时,可选参数值与默认值一起传递。因此,如果您向公共库添加了一个可选参数,请确保您也在编译调用程序程序集。如果您不想更好地编译所有调用程序程序集,请不要使用可选参数,请改用重载方法;
  • @CreativeManix 感谢分享信息 :)

标签: c# .net vb.net-2010 optional-parameters missingmethodexception


【解决方案1】:

只有添加了参数的组件才会构建为补丁部署。调用组件是旧的,因为它没有任何变化。

这里应该改一下,因为旧代码调用了一个已经不存在的方法!

据我所知,它不应该引发错误,因为新参数是可选的。

这不是一个执行时间的决定——它是一个编译时间的决定。如果你有这样的方法:

void Foo(int x, int y = 5)

你这样称呼它:

Foo(10);

然后编译器有效地将其转换为以下调用:

Foo(10, 5);

调用在二进制文件中有 full 参数列表。如果您想以不影响二进制兼容性的方式从单参数版本转到多参数版本,则必须改为添加重载,例如

void Foo(int x)
{
    Foo(x, 5);
}

void Foo(int x, int y)
{
    ...
}

或者,您也可以重新构建调用代码并重新部署它。

我对您的解决方法深表怀疑。您确定当您将 DLL 放回原位时,您将其替换为 new 版本(带有可选参数)而不是旧版本?

【讨论】:

  • 是的,我只替换为新版本。你的回答很有道理。但是由于解决方法,它在我的情况下看起来并不完全正确。
  • @sandeep:我强烈怀疑您对解决方法的诊断有问题,这是不正确的。你试过多少次了?您确定使用新代码看到它了吗?您确定没有替换调用代码吗?它根本不应该工作 - 在 C# 中没有什么可以执行此操作,除非您使用动态类型。
  • @sandeep:对不起,我不明白你之前的评论是什么意思。
  • 一个与替换 DLL 相关的更新......我不会替换被调用的组件。当我收到错误时,我只是删除调用组件并启动 Windows 服务,服务给出错误并且由于缺少 dll 而无法启动。再次放置相同的调用 dll 并启动服务,现在它工作正常。所以我想这与 JIT 编译器有关。但仅当我删除一次 dll 时才确定它是如何工作的 :)。
  • @sandeep:是的,它会产生巨大的影响。它没有解释解决方法,但它使其他一切都变得无关紧要。在提问时,您真的需要考虑这样的重要信息。请发布您用于调用该方法的代码。
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2023-01-31
  • 2013-09-03
  • 2013-06-14
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多