2011-05-12 58 views
6

我遇到了反射方法GetMethod沒有爲類返回靜態方法的問題。這只是在實際的iPhone上出錯;在模擬器上它工作正常。我曾嘗試以下:反射方法GetMethod不會返回iPhone上的類的靜態方法,但會在模擬器上執行

MethodInfo methInfo = _type.GetMethod (methodName); 

MethodInfo methInfo = _type.GetMethod (methodName, System.Reflection.BindingFlags.Static); 

但這些都不返回方法名規定的方法。由於它可以在模擬器上工作,因此指定的方法確實存在。我已經用調試器確認我的成員變量_type包含正確的類類型引用。我試圖檢索的方法在類中聲明爲public。

有沒有人遇到過這個或知道爲什麼這將在模擬器上工作,但不是在實際的iPhone?

+0

模擬器和實際的電話有很大的不同。像這樣的差異確實出現了。 MonoTouch論壇可能是一個更好的問題。 – 2011-05-12 01:23:30

+0

我的印象是,MonoTouch論壇已經在這裏轉移;至少在今年早些時候在MonoTouch論壇上發佈了這樣的信息。 – BruceHill 2011-05-12 02:11:54

+0

MT團隊確實監控SO,並且通常會回答有關MT的大多數問題。 – Jason 2011-05-12 02:50:36

回答

7

儘管在iOS上沒有完全運行,但反射仍然有效。問題在於連接器在設備的配置中被激活,並且由於它未被使用而正在切斷該方法。鏈接器不能「看到」反射調用。

如果它是一個自定義對象,與PreserveAttribute裝飾它:

[Preserve(AllMembers=true)] 
public class MyClass 
{} 

如果是從SDK一個對象,你有兩個選擇:

  1. 完全禁用鏈接。這是不好的,因爲最終的尺寸會很大。
  2. 直接在代碼中使用該方法一次,以便鏈接器知道它在那裏並且不會去掉它。
+0

謝謝,Dimitris。你對這個答案很滿意。鏈接器確實刪除了這些方法。我添加了您提到的_Preserve_屬性,並且我的應用程序現在可以在iphone上正確運行。謝謝! :) – BruceHill 2011-05-12 07:38:52

+0

System.Reflection在iOS上的工作方式與Mono支持的任何其他體系結構/操作系統一樣。不支持的是System.Reflection.Emit,它完全是一個不同的野獸。好的建議,否則:) – 2011-05-12 09:11:52

+0

在iOS上的System.Reflection有一些問題。並非它的所有方面都起作用,其中大部分都起作用。 – 2011-05-12 09:57:17