Java 如何使使用IKVM com创建的.dll可见?

Java 如何使使用IKVM com创建的.dll可见?,java,.net,excel,ikvm,vba,Java,.net,Excel,Ikvm,Vba,我看过一些关于这个的帖子,但到目前为止我还没有看到任何解决方案。我有一个.jar文件,我正在通过它转换为.NETDLL。我试图弄清楚如何使DLL中的方法在ExcelVBA环境中可用。详情如下 1.)安装IKVM并将其DLL注册到GAC 2.)运行IKVM创建.net.dll(mytest.dll) 3.)注册了新的.dll regasm mytest.dll 4.)在这里,我创建了一个VB.NET项目,并添加了mytest.dll和IKVM.OpenJDK.Core.dll作为对该项目的引用。

我看过一些关于这个的帖子,但到目前为止我还没有看到任何解决方案。我有一个.jar文件,我正在通过它转换为.NETDLL。我试图弄清楚如何使DLL中的方法在ExcelVBA环境中可用。详情如下

1.)安装IKVM并将其DLL注册到GAC

2.)运行IKVM创建.net.dll(mytest.dll)

3.)注册了新的.dll

regasm mytest.dll
4.)在这里,我创建了一个VB.NET项目,并添加了mytest.dll和IKVM.OpenJDK.Core.dll作为对该项目的引用。然后我就可以访问.NET中.dll中的方法。这太棒了

5.)我真正想做的是能够在VBA中使用.dll。最初vba不会直接接受.dll,因为它是.net库。我试图创建类型库:

regasm /codebase /tlb mytest.dll
这创建了一个.tlb文件,它很好,但是它确实抛出了一个警告,警告库没有强名称

6.)然后我将.tlb作为引用加载到vba编辑器中。但是,当我尝试访问这些方法时,什么都没有显示。类似地,如果我在对象查看器中查找我的库,我可以看到我的两个类,但不能看到这些类的成员

此外,我想我可能还需要在VBA中以某种方式引用IKVM.OpenJDK.Core.dll。但是,我也不能这样做,因为它是一个.NET.dll


是否有人成功地将.jar文件转换为可与VBA一起使用的文件?

我认为您始终需要显式地将类标记为可通过COM互操作使用。下面是一个可从VBA使用的Java类示例:

import cli.System.Runtime.InteropServices.*;

@ClassInterfaceAttribute.Annotation(ClassInterfaceType.__Enum.AutoDual)
public class SampleWidget {
  public int Add(int x, int y) {
    return x + y;
  }
}
以下是编译的步骤:

  • 将IKVM.Runtime.dll和所有IKVM.OpenJDK.*.dll复制到当前目录或GAC中
  • 运行“ikvmstub mscorlib”生成mscorlib.jar
  • 创建一个名为SampleWidget.Java的Java源代码,其中包含上述代码
  • javac-cp mscorlib.jar;。SampleWidget.java
  • ikvmc-out:SampleLibrary.dll SampleWidget.class-r:mscorlib.dll
  • tlbexp SampleLibrary.dll
  • regasm/codebase SampleLibrary.dll(此步骤需要管理员权限)
  • 现在,您可以从VBA添加对SampleLibrary.tlb的引用,并使用SampleWidget类

    import cli.System.Runtime.InteropServices.*;
    
    @ClassInterfaceAttribute.Annotation(ClassInterfaceType.__Enum.AutoDual)
    public class SampleWidget {
      public int Add(int x, int y) {
        return x + y;
      }
    }