如何使用IKVM com创建.dll?

use*_*580 7 .net java ikvm vba excel-vba

我已经看过几篇帖子,但到目前为止我还没有看到任何解决方案.我有一个.jar文件,我正在通过IKVM转换为.NET DLL .我试图弄清楚如何在excel VBA环境中使DLL中的方法可用.这是细节.

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

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

ikvmc mytest.jar
Run Code Online (Sandbox Code Playgroud)

3.)注册了新的.dll

regasm mytest.dll
Run Code Online (Sandbox Code Playgroud)

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

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

regasm /codebase /tlb mytest.dll
Run Code Online (Sandbox Code Playgroud)

这创建了一个很好的.tlb文件,但它确实发出了关于库没有强名称的警告.

6.)然后我在我的vba编辑器中加载.tlb作为参考.这是有效的,但是当我尝试访问方法时,没有任何显示.同样,如果我查看我的库的对象查看器,我可以看到我的两个类,但不能看到这些类的成员.

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

有没有人成功将.jar文件转换为可以与VBA一起使用的东西?

Jer*_*ers 11

我认为你总是需要通过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;
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是编译的步骤:

  1. 将IKVM.Runtime.dll和所有IKVM.OpenJDK.*.dll复制到当前目录或GAC中.
  2. 运行"ikvmstub mscorlib"以生成mscorlib.jar.
  3. 创建一个名为SampleWidget.java的Java源代码,其中包含上面的代码.
  4. javac -cp mscorlib.jar;.SampleWidget.java
  5. ikvmc -out:SampleLibrary.dll SampleWidget.class -r:mscorlib.dll
  6. tlbexp SampleLibrary.dll
  7. regasm/codebase SampleLibrary.dll(此步骤需要管理员权限)

现在,您可以从VBA添加对SampleLibrary.tlb的引用,并使用SampleWidget类.