JNI调用.NET dll

时间:2014-06-21 17:23:40

标签: java c# .net dll java-native-interface

我正在尝试创建一个Java应用程序,它将通过一个中间的Visula C ++ dll调用C#dll,当我尝试从cmd提示符或Eclipse IDE运行.class文件时,这一切都很好,但问题是为了我需要将C#dll放在与Java.exe相同的目录中,否则会发生本机调用异常,从而无法构建Java项目,任何关于如何实现这一点的想法

2 个答案:

答案 0 :(得分:3)

还有其他方法,没有COM。如果您无法更改.NET组件以支持COM客户端,您可能会发现一个更好或需要一个。

当加载CLR的进程时,程序集搜索路径由进程的主Win32模块的位置决定。程序集搜索路径与Win32 DLL搜索路径不同。在这种情况下,它以java.exe的位置开头。因此,搜索路径包括全局程序集缓存(GAC),java.exe文件夹和在java.exe.config中列为程序集探测路径的子文件夹(如果存在)。

请参阅How the Runtime Locates Assemblies

这导致了一些选择:

  1. 在GAC中安装程序集。 (在最终用户计算机上应该使用安装程序,但在开发人员计算机上,您可以使用gacutil。)
  2. 将程序集放在java.exe文件夹中。或者,相反,将Java副本放在应用程序文件夹中。
  3. 创建一个具有程序集写入权限的子文件夹。创建或更新java.exe.config并将子文件夹列为探测路径。
  4. 使用Java Invocation API在C或C ++中创建自己的java.exe。它与JNI一起记录在案。您可以随意命名,因为毕竟它是您的应用程序。 (这就是许多基于Java的应用程序所做的事情,即使他们不使用.NET。例如,eclipse和LibreOffice。)documentation在C中提供了一个完整的示例。对于典型的MSVC构建,{ {1}}需要在项目的包含路径上,jni.h需要在项目的库路径上,jvm.lib需要在Win32 DLL搜索路径中。
  5. 其他替代方案:

    1. VC DLL可以在需要程序集之前从路径显式加载程序集。见Assembly::LoadFile
    2. 在标准搜索找不到装配后,按需装载装配。请参阅AppDomain::AssemblyResolve Event(但请注意,其描述错误:如果您的自定义解析程序失败,则未发生故障。)

答案 1 :(得分:1)

您可以使用COM Interop启用和注册托管(.NET)dll。 请看这个链接:http://support.microsoft.com/kb/828736