簡體   English   中英

添加可選參數后System.MissingMethodException

[英]System.MissingMethodException after adding an optional parameter

我在一個組件中有一個可選參數之后得到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的一些內部。

如果需要更多信息,請告訴我。

只有添加了參數的組件才會構建部署為補丁。 調用組件是舊的,因為它沒有變化。

應該有一個變化,因為舊代碼調用一個不再存在的方法!

據我所知,它不應該引發錯誤,因為新參數是可選的。

這不是執行時決定 - 這是一個編譯時決定。 如果您有這樣的方法:

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放回原位時你用版本(帶有可選參數)而不是舊版本替換它嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM