从 Java 调用 .NET 程序集:JVM 崩溃

2023-11-26

我有一个第三方 .NET 程序集和一个大型 Java 应用程序。我需要从Java应用程序调用.NET类库提供的方法。该程序集不支持 COM。 我已经在网上搜索过,到目前为止我有以下内容:

C# 代码 (cslib.cs):

using System;

namespace CSLib
{
    public class CSClass
    {
        public static void SayHi()
        {
            System.Console.WriteLine("Hi");
        }
    }
}

编译(使用.net 3.5,但使用2.0时也会发生同样的情况):

csc /target:library cslib.cs

C++ 代码(clib.cpp):

#include <jni.h>
#using <CSLib.dll>

using namespace CSLib;

extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
    CSLib::CSClass::SayHi();
}

编译(使用VC 2008工具,但使用2003工具时也会发生同样的情况):

cl /clr /LD clib.cpp
mt -manifest clib.dll.manifest -outputresource:clib.dll;2

Java代码(CallCS.java):

class CallCS {
    static {
       System.loadLibrary("clib");
    }
    private static native void callCS();
    public static void main(String[] args) {
        callCS();
    }
}

当我尝试运行 java 类时,Java VM 在调用该方法时崩溃(它能够加载库):



#
# An unexpected error has been detected by Java Runtime Environment:
#
#  Internal Error (0xe0434f4d), pid=3144, tid=3484
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [kernel32.dll+0x22366]
#
...
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  CallCS.callCS()V+0
j  CallCS.main([Ljava/lang/String;)V+0
v  ~StubRoutines::call_stub
  

但是,如果我创建一个加载 clib.dll 并调用导出函数 Java_CallCS_callCS 的普通 cpp 应用程序,则一切正常。 我在 x86 和 x64 环境下都尝试过,结果是一样的。我没有尝试过其他版本的Java,但我需要代码在1.5.0上运行。

此外,如果我修改 clib.cpp 以仅调用系统方法,即使在 Java 中一切也能正常工作:

#include <jni.h>
#using <mscorlib.dll>

using namespace System;

extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
    System::Console::WriteLine("It works");
}

总结一下:

  1. 我能够从 Java -> clib.dll -> mscorlib.dll 调用系统方法
  2. 我能够从 CPPApp -> clib.dll -> cslib.dll 调用任何方法
  3. 我无法从 Java -> clib.dll -> cslib.dll 调用任何方法

我知道使用上面的 1. 的解决方法 - 我可以使用反射来加载程序集并仅使用系统调用调用所需的方法,但代码变得混乱,我希望有更好的解决方案。

我知道 dotnetfromjava 项目,它使用反射方法,但不希望增加超出需要的复杂性。但是,如果没有其他方法,我会使用类似的方法。

我也查看过 ikvm.net,但我的理解是它使用自己的 JVM(用 C# 编写)来实现魔法。然而,在虚拟机下运行整个 Java 应用程序对我来说是不可能的。

Thanks.


好吧,谜团解开了。

JVM 崩溃是由未处理的 System.IO.FileNotFoundException 引起的。引发异常的原因是在调用 exe 文件所在的文件夹中搜索 .NET 程序集。

  1. mscorlib.dll 位于全局程序集缓存中,因此它可以工作。
  2. CPP 应用程序 exe 与程序集位于同一文件夹中,因此它也可以工作。
  3. cslib.dll 程序集既不在 java.exe 文件夹中,也不在 GAC 中,因此它不起作用。

看来我唯一的选择是在 GAC 中安装 .NET 程序集(第三方 dll 确实有一个强名称)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Java 调用 .NET 程序集:JVM 崩溃 的相关文章

  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 哪个提交有这个 blob?

    给定 blob 的哈希值 有没有办法获取树中包含该 blob 的提交列表 以下两个脚本都将 blob 的 SHA1 作为第一个参数 在其后面 可选 任何参数git log会明白 例如 all搜索所有分支而不仅仅是当前分支 或者 g在转发日志
  • 计算图片中蓝色像素的数量

    我是 openCV 和 Python 的新手 有一个关于它的问题 我试图找到图片的蓝色像素数量 以便我可以将它们用作阈值 以便将其他图片与它进行比较 我已尝试查看文档 但尚未找到任何有用的内容 任何人都可以给出提示或帮助吗 BLUE MAX
  • “object”不包含动态定义

    我正在使用下面描述的方法 即返回动态结果 public static dynamic GetCouponDetailsbyCouponID Guid couponID using var loEntities new Entities dy
  • 处理带有 Yield 返回的 Enumerable 对象的正确模式是什么?

    是否存在返回 Enumerable 中所有项目的标准模式 我经常发现我的一些代码反映了以下模式 public IEnumerable YieldReturningFunction logic and various standard yie
  • 命名空间“<全局命名空间>”已包含“工作流”的定义

    我正在开展自定义工作流程活动 我使用代码生成工具 CrmSvcUtil exe 创建了自己的 helper cs 早期绑定实体类 当我尝试编译代码时 它返回以下错误 命名空间 已包含 工作流 的定义 来自 Helper cs 文件 有谁知道
  • 如何创建我的记录器?

    我使用 log4j 进行日志记录 我想修改方法 warn error 我想修改这个方法中的消息 那么 有什么办法 如何创建我自己的记录器呢 public class MyLogger extends Logger protected MyL
  • 在 R 中,如何逐行读取 CSV 文件并将内容识别为正确的数据类型?

    我想读取一个 CSV 文件 其第一行是变量名称 后续行是这些变量的内容 有些变量是数字 有些是文本 有些甚至是空的 file path file csv f file file r varnames strsplit readLines f
  • 安装时在 Inno Setup 中显示许可协议链接

    我正在为我的应用程序使用 Inno Setup 我想在安装时在 Inno Setup 中显示一个链接 许可协议 单独的许可协议向导除外 我想将此链接与某些任务结合起来 当用户单击该链接时 它将导航到特定的 URL 我知道我来晚了 以下代码脚
  • 为什么这个 Java 正则表达式会导致“非法转义字符”错误?

    我正在研究一个上一个问题的解决方案 尽我所能 使用正则表达式 我的模式是 d 4 w 3 0 1 9 12 0 9 3 01 01 0 9 2 0 3 0 5 0 9 2 根据 NetBeans 我有两个非法转义字符 我猜它与 d 和 w
  • 相当于Firestore中的.push?

    我正在尝试将以前使用实时数据库的 firebase 实现转换为使用 firestore 因为我喜欢集合的想法以及使用它的好处 我如何将以下内容实现为 firestore 等效项 firebase database ref documentP
  • Django 将现有字段更改为外键

    我有一个 Django 模型 以前看起来像这样 class Car models Model manufacturer id models IntegerField 还有另一种模型叫Manufacturer那id字段指的是 然而 我意识到使
  • Hibernate 在 HQL 中处理“@”字符时遇到困难

    使用 Hibernate 和 Spring Social 我正在尝试通过电子邮件地址查询数据库 当我执行此查询时 公共帐户 findAccountByUsername String 用户名 Session session sessionFa
  • $观察一个物体

    我想监视字典中的更改 但由于某种原因未调用监视回调 这是我使用的控制器 function MyController scope scope form name my name surname surname scope watch form
  • 是否可以终止正在运行的 Web Worker?

    我有一个网络工作人员使用 ajax 请求运行一项耗时的例行任务 我可以从主线程终止它们而不等待它们完成吗 这就是我生成和终止它的方式 button parse categories click function if parseCatego
  • 使用和不使用额外变量时的奇怪浮点行为,为什么?

    当我在 VC 2013 32 位 无优化 中运行以下代码时 include
  • C# 寻找相似颜色

    我想调用带有参数颜色的方法 但有很多颜色仅存在色度差异 我怎样才能找到与我的颜色只有一点点不同的颜色 例如 AntiqueWhite 和 Bisque Here s调色板 Bitmap LogoImg new Bitmap file1 jp
  • Android - 检测 URL mime 类型?

    在我的 Android 应用程序中 我有从数据库访问的各种 URL 然后打开 WebView 来显示该 URL 通常 该 url 看起来像这样 http www mysite com referral php id 12345 这些引荐链接
  • 将页面添加到活动管理

    我们想要向我们的管理添加一个帮助页面 并且我们正在使用活动管理 gem 此页面不与任何模型关联 因此我正在努力弄清楚如何让链接显示在每个页面的菜单栏中 我知道我有点晚了 但我通常都会迟到 D ActiveAdmin register pag
  • 禁用 EditText 闪烁光标

    有谁知道如何禁用闪烁的光标EditText view 您可以使用 xml 属性android cursorVisible false 或以编程方式 java view setCursorVisible false kotlin view i
  • 从 Java 调用 .NET 程序集:JVM 崩溃

    我有一个第三方 NET 程序集和一个大型 Java 应用程序 我需要从Java应用程序调用 NET类库提供的方法 该程序集不支持 COM 我已经在网上搜索过 到目前为止我有以下内容 C 代码 cslib cs using System na