2011-06-17 60 views
0

公共非靜態方法,可以在C#中調用一個方法(非靜態)沒有實例的類如:C#調用使用反射沒有實例其

public class MyClass 
{ 
    public void MyMethod() 
    { 
     Console.WriteLine("method called"); 
    } 
} 

我已經試過這使用System.Reflection.Emit命名空間的方法,我複製的MyMethod()的IL爲動態方法,但得到的異常:

檢測FatalExecutionEngineError: 運行時遇到致命錯誤。錯誤的地址是0x5dceccf5,線程0x2650。錯誤代碼是0xc0000005。此錯誤可能是CLR中的錯誤,也可能是用戶代碼中不安全或不可驗證的部分。此錯誤的常見來源包括COM-interop或PInvoke的用戶編組錯誤,這可能會破壞堆棧。

 Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); 
     Type t = a.GetType("Tutorial.MyClass"); 
     MethodInfo m = t.GetMethod("MyMethod"); 
     MethodBody mb = m.GetMethodBody(); 

     DynamicMethod dm = new DynamicMethod("MethodAlias", null, Type.EmptyTypes, typeof(Tutorial.MainWindow), true); 
     DynamicILInfo ilInfo = dm.GetDynamicILInfo(); 
     SignatureHelper sig = SignatureHelper.GetLocalVarSigHelper(); 
     ilInfo.SetLocalSignature(sig.GetSignature()); 
     ilInfo.SetCode(mb.GetILAsByteArray(), mb.MaxStackSize); 

     try 
     { 
      dm.Invoke(this, null); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

謝謝

+4

'公共靜態無效MyMethod()'這不是非靜態的。 * NO *你不能在不創建實例的情況下調用非靜態方法。 –

+0

你得到了什麼例外? –

+0

你是不是想讓MyMethod靜態化? – Sven

回答

3

不,我知道的。因爲它不是靜態的。

我只是說「不」,但我的答覆還不夠長。

+0

這是正確的。 –