2013-01-10 68 views
0

我需要使用IKVM從C#運行JAR文件。 JAR包含一個構造函數將枚舉作爲其參數之一的類。我面臨的問題是,當我嘗試使用IKVM在C#中創建此類的實例時,會引發IllegalArgumentException。將枚舉值傳遞給C#的Java構造函數#

爪哇枚舉:

public class EventType{ 
    public static final int General; 
    public static final int Other; 
    public static int wrap(int v); 
} 

的Java Class:

public class A{ 
    private EventType eType; 
    public A(EventType e){ 
    eType = e; 
    } 
} 

C#用途:

/* loader is the URLClassLoader for the JAR files */ 
java.lang.Class eArg = java.lang.Class.forName("A", true, loader); 

/* Instantiate with the underlying value of EventType.General */ 
object obj = eArg.getConstructor(EventType).newInstance(0); 

EARG正確由的forName(..)方法加載。但是,eArg類的實例化會引發IllegalArgumentException。除了exception.TargetSite.CustomAttributes之外,異常中沒有消息指定該方法未實現。我也嘗試將構造函數參數作爲java.lang.Field對象傳遞,但即使這樣也給出了相同的異常。

有沒有人有什麼建議我可能做錯了?

+0

如何在C#代碼中定義EventType? –

+0

public enum EventType {General,Other};包含此枚舉的DLL使用ikvmstub轉換爲JAR,然後導入到Java文件中。 – naveen

回答

1

而不是傳遞0(基礎值),您需要傳遞(盒裝)枚舉值。所以這應該工作:

/* loader is the URLClassLoader for the JAR files */ 
java.lang.Class eArg = java.lang.Class.forName("A", true, loader); 

/* Instantiate with the underlying value of EventType.General */ 
object obj = eArg.getConstructor(EventType).newInstance(EventType.General); 
+0

謝謝!它工作完美。 – naveen

0

我不是100%確定,但我相信問題是,在.NET中,enum的默認基礎類型是int,但在Java中,您將EventType定義爲類。 Java中的構造函數期望一個對象,但是從.NET開始,您試圖通過相當於int的對象。