Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加可选参数后System.MissingMethodException_C#_.net_Vb.net 2010_Optional Parameters_Missingmethodexception - Fatal编程技术网

C# 添加可选参数后System.MissingMethodException

C# 添加可选参数后System.MissingMethodException,c#,.net,vb.net-2010,optional-parameters,missingmethodexception,C#,.net,Vb.net 2010,Optional Parameters,Missingmethodexception,在一个组件中有一个可选参数,而另一个组件调用它时没有生成,因为它使用旧数量的参数调用它,所以我得到System.MissingMethodException错误 唯一添加了参数的组件是构建一个部署为补丁的组件。调用组件是旧的,因为它没有变化 当调用组件运行时,会出现以下错误: 例外信息 异常类型:System.MissingMethodException消息:方法不是 发现:唇瓣 IPSD.BnB.Transaction.Postage.GetLabelURLs(System.String)“”

在一个组件中有一个可选参数,而另一个组件调用它时没有生成,因为它使用旧数量的参数调用它,所以我得到System.MissingMethodException错误

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

当调用组件运行时,会出现以下错误:

例外信息

异常类型:System.MissingMethodException消息:方法不是 发现:唇瓣 IPSD.BnB.Transaction.Postage.GetLabelURLs(System.String)“”。数据: System.Collections.ListDictionaryInternal TargetSite:无效 GenerateScanForm(Int32,Int32)帮助链接:空源: BnBDispenseQueueProcess

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

我们找到了一个非常有条理的解决办法,让它运行起来。通过删除更改过的组件一次并运行调用组件,该组件将显示未找到DLL。再次放置相同的DLL,调用组件工作正常:)

我想我缺少了.net的一些内部功能

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

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

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

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

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

void Foo(int x, int y = 5)
Foo(10);
你这样称呼它:

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放回原位时,已将其替换为新版本(带有可选参数),而不是旧版本?

是,我仅替换为新版本。你的回答有道理。但由于解决方法的原因,在我的情况下,它看起来并不完全正确。@sandeep:我强烈怀疑你对解决方法的诊断是不正确的。你试过多少次了?你肯定见过它使用新代码吗?你肯定没有替换呼叫代码吗?它根本不应该起作用-在C#中没有任何地方可以这样做,除非您使用的是动态键入。@sandeep:对不起,我不明白您之前的评论是什么意思。有一个更新与DLL的重放有关。。。。我不更换被调用的组件。当我得到错误,我只是删除调用组件和启动windows服务,服务给出错误,无法启动,因为dll丢失。再次放置相同的调用dll并启动服务,现在它工作正常。所以我猜这与JIT编译器有关。但我不知道它是如何工作的,除非我删除dll一次:)。@sandeep:是的,它会带来巨大的不同。它没有解释解决方法,但它使其他一切都变得有些无关紧要。问问题时,你真的需要考虑像这样的重要信息。请发布您用来调用该方法的代码。我们在一个公共库中添加了可选参数。这破坏了所有正在运行的模块(我们很幸运,它是在测试env)。这些都是.net在开发时的奇特特性,看起来我们在使用它之前必须深入了解它们。谢谢您的提问。@CreativeManix请告诉我您的发现。as无法完全理解它为什么会这样。可能是后面发生了一些编译技巧scene@Sanddep正如Jon Skeet提到的,可选参数是编译时特性。在调用者程序集中的编译时,使用默认值传递可选参数值。所以,如果您向公共库添加了可选参数,请确保您也在编译调用程序集。如果您不想更好地编译所有调用程序集,请不要使用可选参数,而是使用重载方法@CreativeManix感谢分享信息:)