添加可选参数后System.MissingMethodException

san*_*eep 24 .net c# missingmethodexception optional-parameters vb.net-2010

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

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

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

例外信息

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

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

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

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

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

Jon*_*eet 42

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

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

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

这不是执行时决定 - 这是一个编译时决定.如果您有这样的方法:

void Foo(int x, int y = 5)
Run Code Online (Sandbox Code Playgroud)

你这样称呼它:

Foo(10);
Run Code Online (Sandbox Code Playgroud)

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

Foo(10, 5);
Run Code Online (Sandbox Code Playgroud)

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

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

void Foo(int x, int y)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

我对你的解决方法深感怀疑.你确定当你把DLL放回原位时你用版本(带有可选参数)而不是旧版本替换它吗?