如何访问IKVM移植的Java库的.net资源

use*_*804 6 c# ikvm visual-studio-2012

我正在使用IKVM将一些java库移植到我的c#项目中.库api(StanfordNLP)要求加载文件以训练nlp函数使用的统计模型.从文件系统加载文件已经好几周了,但我现在想将文件作为嵌入式资源添加到dll中,而不是从文件系统中检索它.

问题是java api没有找到.net嵌入式资源.

以下是从文件系统检索文件时有效的代码片段:

public class SNLPModel
{
   public LexicalizedParser LP;

   public SNLPModel()
   {
      // Using a relative file path in the target build directory
      LP = LexicalizedParser.loadModel("models-stanford\\englishPCFG.ser.gz");
   }
}
Run Code Online (Sandbox Code Playgroud)

但是当我将"englishPCFG.ser.gz"文件设置为visual studio中的嵌入式资源(使用VS2012)时,更改代码以匹配:

public class SNLPModel
{
   public LexicalizedParser LP;

   public SNLPModel()
   {
        // Using this line of code to verify that the file is being loaded as
        // an embedded resource. Running in debug, I have verified that it is, and
        // noted its complete name.
        string[] s = System.Reflection.Assembly.GetExecutingAssembly()
                        .GetManifestResourceNames();

        java.io.InputStream modelFile = java.lang.ClassLoader
              .getSystemResourceAsStream
              ("FeatureExtraction.StanfordNLP_Models.englishPCFG.ser.gz");

        java.io.ObjectInputStream x = new java.io.ObjectInputStream(modelFile);

        LP = LexicalizedParser.loadModel(x);
   }
}
Run Code Online (Sandbox Code Playgroud)

InputStream对象modelFile始终返回null.我尝试过各种形式的资源字符串,用正斜杠("/"),反斜杠("\")和双反斜杠("\\")替换前两个点(".").我开始怀疑java.io无法访问.net资源.java api无法识别.net资源也就不足为奇了,但我认为IKVM可能会提供一个桥梁.我看过一个名为IKVM.Internals.VirtualFileSystem的引用,但只有一个引用(http://old.nabble.com/Manual-by-name-embedded-resource-lookup--td31162421.html)和避难所找到任何实际包含该类的IKVM dll.

任何帮助将非常感激.我在用:

c#.NET 4.5

Visual Studio 2012

最新的斯坦福NLP java库

IKVM 7.0.4335.0

Jer*_*ers 4

IKVM 中没有对此自动支持,但是您自己可以很容易地做到这一点:

var asm = Assembly.GetExecutingAssembly();
var stream = asm.GetManifestResourceStream("FeatureExtraction.StanfordNLP_Models.englishPCFG.ser.gz");
var inp = new ikvm.io.InputStreamWrapper(stream);
var x = new java.io.ObjectInputStream(inp);
Run Code Online (Sandbox Code Playgroud)