В настоящее время я пытаюсь загрузить и использовать Gephi Toolkit из .Net 4. Сайт С#.
У меня есть версия jar-файла инструментария, скомпилированная для виртуальной машины IKVM, которая работает, как и ожидалось, из приложения командной строки, используя следующий код:
var controller = (ProjectController)Lookup.getDefault().lookup(typeof(ProjectController));
controller.closeCurrentProject();
controller.newProject();
var project = controller.getCurrentProject();
var workspace = controller.getCurrentWorkspace();
Три экземпляра правильно создаются в форме, аналогичной org.gephi.project.impl.ProjectControllerImpl@8ddb93
.
Однако, если я запускаю точно такой же код с точно такими же операторами использования и ссылками, самая первая строка, загружающая экземпляр ProjectController
, возвращает значение null.
Я пробовал пару решений
Во-первых, я попытался игнорировать вызов Lookup.getDefault().lookup(type), вместо этого пытаясь создать свои собственные экземпляры:
var controller = new ProjectControllerImpl();
controller.closeCurrentProject();
controller.newProject();
var project = controller.getCurrentProject();
var workspace = controller.getCurrentWorkspace();
Это терпит неудачу в строке controller.newProject();, я думаю, потому что внутри (с использованием рефлектора) тот же самый Lookup.getDefault().lookup(type) используется в конструкторе, возвращает null и затем выдает исключение.
Во-вторых, отсюда: Поиск в Jython (и Gephi) Я попытался установить %CLASSPATH% к расположению файлов JAR и DLL инструментария.
Есть ли причина, по которой Lookup.getDefault().lookup(type) не будет работать в веб-среде? Я не разработчик Java, поэтому я немного не в курсе Java-стороны этого.
Я бы подумал, что можно создать все экземпляры самостоятельно, но не смог найти способ сделать это.
Я также не могу найти способ понять, почему загрузка ProjectController вернула значение null. Никаких исключений не выдается, и, если я не очень тупой, похоже, нет способа увидеть результат попытки загрузки.
Обновить – Ответ
Основываясь на ответе Jeroen Frijters, я решил проблему следующим образом:
public class Global : System.Web.HttpApplication
{
public Global()
{
var assembly = Assembly.LoadFrom(Path.Combine(root, "gephi-toolkit.dll"));
var acl = new AssemblyClassLoader(assembly);
java.lang.Thread.currentThread().setContextClassLoader(new MySystemClassLoader(acl));
}
}
internal class MySystemClassLoader : ClassLoader
{
public MySystemClassLoader(ClassLoader parent)
: base(new AppDomainAssemblyClassLoader(typeof(MySystemClassLoader).Assembly))
{ }
}
Код ikvm.runtime.Startup.addBootClassPathAssemby()
у меня не работал, но по предоставленной ссылке я смог найти решение, которое работает во всех случаях.