前言
今天同事詢問一個奇怪的問題,他在本機上參考某個 DLL 來執行程式是沒有問題的。
但將它移到 VM Server 上去測試就會發生「找不到方法: ‘System.Object System.Reflection.PropertyInfo.GetValue(System.Object)’。」的錯誤。
研究
目前發現一個狀況就是,該專案是使用 VS 2019 來建置的,.NET 版本為 4.6 。
請同事查看一下, VM Server 中的環境 .NET 版本是幾版的,如下,
1 |
|
透過查看機碼發現, Server 中的 .NET 版為 4.0.x 版本。
即然發現有這樣子的狀況,於是將該 DLL 專案的 .NET 建置版本從 .NET 4.6 改成 .NET 4.0 。
一建置果然發生一樣的錯誤。如下,
可以看到,程式碼中是使用 property.GetValue(source) ,
但是在 .NET 4.0 的 PropertyInfo.GetValue Method並沒有一個參數 GetValue Method ,所以自然就 gg 了,而 .NET 4.5 的 PropertyInfo.GetValue Method 就有了哦!
相對的 PropertyInfo.SetValue Method 也是一樣的狀況哦!
解法
即然原因找到了,解法方式自然也就顯而易見了!
- 一是在 VM Server 上安裝 .NET Framework 4.5(含以上)。
- 二是調整程式,補上缺的參數,其實就是多加上個 null 就解掉了。
1
2
3
4
5
var value = property.GetValue(source, null);
prop.SetValue(target, value, null);
參考資料
.NET 4.0 PropertyInfo.GetValue Method
.NET 4.5 PropertyInfo.GetValue Method