我目前正嘗試從.Net 4 C#網站中加載和使用Gephi Toolkit。是否可以在網站中使用與IKVM一起編譯的Gephi?
我有一個版本靠在IKVM虛擬機,作爲使用以下代碼從一個命令行應用程序預期其中工程編譯工具包jar文件:
var controller = (ProjectController)Lookup.getDefault().lookup(typeof(ProjectController));
controller.closeCurrentProject();
controller.newProject();
var project = controller.getCurrentProject();
var workspace = controller.getCurrentWorkspace();
的三個實例的形式正確地實例化類似於[email protected]
。
但是如果我運行完全相同的代碼,使用完全相同的使用語句&引用,加載ProjectController
實例的第一行返回null。
我已經嘗試了幾個解決方案
首先,我試圖忽略Lookup.getDefault()查詢(類型)調用,而不是試圖創建自己的實例:
var controller = new ProjectControllerImpl();
controller.closeCurrentProject();
controller.newProject();
var project = controller.getCurrentProject();
var workspace = controller.getCurrentWorkspace();
這在線controller.newProject失敗();我認爲,因爲內部(使用反射器)相同的Lookup.getDefault()。lookup(類型)在構造函數中使用,返回null,然後引發異常。
其次,從這裏:Lookup in Jython (and Gephi)我試圖將%CLASSPATH%設置爲工具包JAR和DLL文件的位置。
Lookup.getDefault()。lookup(type)在Web環境中不起作用的原因是什麼?我不是一個Java開發人員,所以我對Java的這方面有點不太瞭解。
我原以爲有可能自己創建所有的實例,但一直沒能找到辦法。
我也無法找到一種看到爲什麼ProjectController加載返回null的方法。沒有例外,除非我非常愚蠢,似乎沒有一種方法可以看到嘗試加載的結果。
更新 - 答
基於從吉榮弗裏吉特斯答案,我解決了這樣的問題:
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()
似乎並沒有爲我工作,但是從提供的鏈接,我能夠找到一個解決方案,似乎在所有情況下工作。