gpt4 book ai didi

c# - 通过 C++ 包装器从 java 调用 c# dll 时出错

转载 作者:太空狗 更新时间:2023-10-29 23:06:00 32 4
gpt4 key购买 nike

首先,这是我的配置:我正在使用 64 位 win 7 pc,以及虚拟机中的 XP 32 位 SP3。我使用 Visual Studio 2010 和 Eclipse。

我正在使用以下组件:

  • BusinessDll:我想让 java 访问的 C# dll(32 位 .NET 框架 3.5)
  • Wrapper:C++ dll 32 位,用于将 java 调用转发给 C#。它引用了 c# dll。
  • Wrapper Test 调用包装函数的 c++ 测试 exe。
  • Java组件:使用jre7 32位的测试项目。

我想在 Java 组件中使用 BusinessDll,所以我决定在 C++ 中使用 jna 和包装器。

现在这里是我完成的调用测试:

  • 包装器测试 -> 包装器 -> BusinessDll ----> 确定

  • Java组件->包装器---->确定

  • Java 组件 -> 包装器 -> BusinessDll ----> KO

消息:

#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (0xe0434352), pid=264, tid=6488
#
# JRE version: 7.0_25-b16
# Java VM: Java HotSpot(TM) Client VM (23.25-b01 mixed mode windows-x86 )
# Problematic frame:
# C [KERNELBASE.dll+0xc41f] RaiseException+0x58

崩溃堆栈:

Stack: [0x00810000,0x00860000],  sp=0x0085e13c,  free space=312k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [KERNELBASE.dll+0xc41f] RaiseException+0x58
C [clr.dll+0xe2b54] GetCLRFunction+0xd209
C [clr.dll+0x12849b] CopyPDBs+0x4ab5
C [clr.dll+0x2ccacd] CorLaunchApplication+0x255e5

我在 Win 7 64 位和 XP 32 位虚拟机上得到了相同的结果。

如下,我使用的代码:

Java 组件

System.load("D:\\dev\\Wrapper.dll");
public interface BioWrapp extends Library
{
Wrapp INSTANCE = (Wrapp) Native.loadLibrary("Wrapper", Wrapp.class);
void SuperDummy();
}
public static void main(String[] args)
{
BioWrapp mysdll = BioWrapp.INSTANCE;
mysdll.BioSuperDummy();
}

包装器

Java接口(interface).h

#ifdef BIOWRAPPDLL_EXPORTS
#define BIOWRAPPDLL_API __declspec(dllexport)
#else
#define BIOWRAPPDLL_API __declspec(dllimport)
#endif

namespace BioJavaWrapperNp
{
class BioJavaWrapper
{
public:
static BIOWRAPPDLL_API void BioSuperDummy();
};
}

点网接口(interface).h

#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) void superDummy( );
#ifdef __cplusplus
}
#endif

包装.cpp

#include "stdafx.h"
#include "BioJavaWrapper.h"

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace BioBusiness;

namespace BioBusinessNp
{
void BioJavaWrapper::BioSuperDummy()
{
BusinessClass::superDummy();
}
}

C# dll 中的 BioBusiness 命名空间的 BusinessClass 部分。而 superDummy 是 BioBusiness 的一种方法。

我已经尝试了几天了,欢迎任何想法。感谢阅读。

阿德里安

最佳答案

你的 C++ DLL 是由托管 C++ 编写的,我加倍了这就是你得到这个异常的原因。我想你可以试试这个:1.用native C++写wrapper DLL,会调用mixed C++ DLL中的函数,然后mixed C++会调用C# DLL中的函数2. 用 native C++编写包装器DLL,并将C# DLL 导出为COM,然后在 native C++ DLL 中使用此COM 组件。

还有一件事:内部错误 (0xe0434352)。 0xe0434352 表示此异常由 CLR 生成。您可以使用 Windbg 获取异常的详细信息。请阅读此article

关于c# - 通过 C++ 包装器从 java 调用 c# dll 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17217096/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com