【问题标题】:How do I make a .dll created with IKVM com visible?如何使使用 IKVM com 创建的 .dll 可见?
【发布时间】:2013-02-04 16:48:36
【问题描述】:

我看过一些关于此的帖子,但到目前为止我还没有看到任何解决方案。我有一个 .jar 文件,我正在通过 IKVM 将其转换为 .NET DLL。我试图弄清楚如何使 DLL 中的方法在 excel VBA 环境中可用。这是详细信息。

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

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

ikvmc mytest.jar

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.) 然后我在我的 vba 编辑器中加载了 .tlb 作为参考。这可行,但是当我尝试访问这些方法时,什么也没有出现。同样,如果我在对象查看器中查看我的库,我可以看到我的两个类,但看不到这些类的成员。

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

有没有人成功地将 .jar 文件转换为可用于 VBA 的文件?

【问题讨论】:

    标签: java .net excel ikvm vba


    【解决方案1】:

    我认为您总是需要明确地标记一个类以通过 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;
      }
    }
    

    编译步骤如下:

    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 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多