2013-01-10 2 views
0

IKVM을 사용하여 C#에서 JAR 파일을 실행해야합니다. JAR에는 생성자가 해당 매개 변수 중 하나로서 열거 형을 사용하는 클래스가 들어 있습니다. 내가 직면 한 문제는 IKVM을 사용하여 C#에서이 클래스의 인스턴스를 만들려고 할 때 IllegalArgumentException이 발생한다는 것입니다.C#에서 Java 생성자에 열거 값을 전달합니다.

자바 ENUM :

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

자바 클래스 :

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

C# 1 사용 :

/* 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을 던집니다. 예외를 제외하고는 메시지가 없습니다 .TargetSite.CustomAttributes는 메소드가 구현되지 않았 음을 지정합니다. 또한 생성자 인수를 java.lang.Field 객체로 전달하려고 시도했지만 동일한 예외가 발생했습니다.

누구든지 내가 잘못하고있는 것에 대한 제안 사항이 있습니까?

+0

C# 코드에서 EventType은 어떻게 정의됩니까? –

+0

공개 열거 형 EventType {General, Other}; 이 열거 형을 포함하는 DLL은 ikvmstub를 사용하여 JAR로 변환 된 다음 Java 파일로 가져 왔습니다. – naveen

답변

1

0 (기본 값)을 전달하는 대신 (박스형) enum 값을 전달해야합니다. 따라서 이것이 작동해야합니다 :

/* 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과 동일한 전달하려고합니다.