Dll中的方法向外返回dynamic型別可能會失敗

2022-07-13 12:21:09 字數 1228 閱讀 8828

如果dll中有某個類的方法返回dynamic例項,並且dynamic物件實際例項為匿名類型別,則dll的外部使用者可能最終無法正常使用此dynamic物件。當使用此dynamic物件時,可能會遇到x屬性沒有在object中定義的錯誤,此錯誤屬於microsoft.csharp.runtimebinder.runtimebinderexception例項——即使debug時,能夠看到返回的物件例項確實含有x屬性。

這很詭異,返回匿名類,並用dynamic進行標示是節省**量的利器。但在此處,執行時卻無法發現動態的物件型別。經過多次試驗,再說明一下會出現此問題的場景:

環境為.net framework 4.6 & visual stdio 2015 community.

在dll中定義類方法,並返回dynamic。實際返回型別為匿名型別。

///

///類庫工程

///namespace

dynamicdll

; }

在dll外部呼叫此方法,列印其屬性值。dll外部是指在dll工程外部,而不是不同的命名空間。

namespace

limstest

,,");

執行以上測試**,出現錯誤。

測試方法:

在同乙個.csproject中,相同的**、使用方法不會出現此問題。

在dll專案內部使用,不會出現問題。

只有在dll中定義,外部使用才會出現問題。

可能的原因:

如果字段、方法引數或者返回值的型別是dynamic,編譯器會將該型別轉換為system.object,並在元資料中向字段、引數或返型別應用system.runtime.compilerservice.dynamicattribute的例項。從上圖的錯誤中可以看到返回的物件已經被轉換為object,但卻沒有能成功應用runtime binding。外部呼叫後,runtime沒有找不到合適的、或者不知道如何在執行動態執行轉換。如果跟蹤除錯,雖然可以看到型別為匿名類,並且擁有屬性(值),但是執行會失敗。

解決方案:

返回非dynamic物件。

不要使用匿名物件作為dynamic的返回值。使用確定的、在dll中明確定義的類,返回dynamic不會出現錯誤。

總結:不要在dll中向其外部使用者返回實際型別為匿名類的dynamic物件例項。

DLL中函式返回CString的問題

我用mfc做了個regular dll,其中乙個介面形如 cstring getname 或者 void getname cstring 應用程式一般這樣來呼叫 cstring name getname 或者getname name are removed during preprocessing....

delphi中dll返回string問題

有高手言 1.在dll中定義返回string字串的函式時,如果沒有特殊處理呼叫該函式 在退出呼叫該函式的過程 函式 事件 時,會出現以下錯誤 invalid pointer operator 2.當在單元中新增sharemem時,在退出程式的時候會出現同樣的錯誤 3.當在呼叫dll的專案檔案中 不是...

C 反射動態呼叫dll中的方法,並返回結果

最近在看工廠開發模式,發現用到了反射,之前只聽說過也沒怎麼用過 所以花了點時間重新溫習了一遍 反射的作用是動態的載入某個dll 程式集 並執行該程式集中的某個方法,並返回結果 當然也可以給該方法傳遞引數 直接上 namespace assembly name 上邊寫乙個測試類,命名空間是assemb...