36

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

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

当调用组件运行时,它会给出错误:

异常信息

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

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

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

我想我错过了.net的一些内部结构。

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

4

1 回答 1

52

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

应该有变化,因为旧代码调用了一个不再存在的方法!

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

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

void Foo(int x, int y = 5)

你这样称呼它:

Foo(10);

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

Foo(10, 5);

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

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

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

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

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

于 2012-03-27T06:56:08.197 回答