Java调用C#

这篇具有很好参考价值的文章主要介绍了Java调用C#。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于项目采用Hybrid热更,走纯C#开发,目前战斗由客户端到服务端(客户端提供dll),服务端负责调用,故需要走Java 调C# dll逻辑。

1、JNI:不支持泛型(pb)没法转C++成功

2、JNA:亲测可用。原理Java调用C++ ,C++调C#

操作步骤:

        1、生成C#dll,放在java工程所用的jdk,bin目录下

using System.Collections.Generic;
using System.IO;
using System;
using System.Collections;
using System.Linq;
using System.Reflection;
using Proto;

namespace CScriptDll
{
    public class JCSTest
    {
        public int Sum(int _x, int _y)
        {
            return _x + _y;
        }
        
        public int GetInt()
        {
            return new TestClass().Str;
        }
        public static byte[] GetBytes()
        {
            return File.ReadAllBytes("GlobalConfig.bytes");
        }
        public float GetGobal()
        {
            //此处通过pb读取表
            GlobalConfigMgr.LockLoadTable();
            return GlobalConfigMgr.GetFloatVal(EGlobal.Advertisements);
        }
    }
    public class TestClass
    {
        public int Str = 1996;
    }

}

Java调用C#

         2、创建C++ dll。

        添加引用,引用导出的C#的dll文件,然后输出代码如下:

#include "pch.h"

#ifdef MYLIBAPI 
#else 
#define  MYLIBAPI  extern "C" __declspec(dllimport)     
#endif 
MYLIBAPI int add(int a, int b); //添加函数声明
MYLIBAPI int GetInt();
MYLIBAPI float GetGobal();

using namespace System;
using namespace CScriptDll;

int add(int a, int b) {
    JCSTest^ test = gcnew JCSTest();
    return test->Sum(a, b);
}

int GetInt() {
    JCSTest^ test = gcnew JCSTest();
    return test->GetInt();
}
float GetGobal() {
    JCSTest^ test = gcnew JCSTest();
    return test->GetGobal();
}

注意:属性->常规->配置类型(动态库.dll)

        属性->高级->公共语言运行时支持(/clr)

       错误: 严重性代码说明项目文件行禁止显示状态错误C7681    C++/CLI 或 C++/CX 不支持两阶段名称查找;请使用 /Zc:twoPhase-  

        出现上述错误:属性->c/C++/语言->符合模式(否)

       3、JAVA调用 :导入两个jar包,并加入库。jna地址:

GitHub - java-native-access/jna: Java Native Access

Java调用C#

package org.example;

import java.io.IOException;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Main {
    public static void main(String[] args) throws IOException {
        JavaToCS clib = JavaToCS.Instance;
        System.out.println("测试返回结果:"+clib.add(9965, 13));
        System.out.println("测试返回结果getInt :"+clib.GetInt());
        System.out.println("测试返回结果getInt :"+clib.GetGobal());

    }
}
interface JavaToCS extends Library {
    JavaToCS Instance = (JavaToCS) Native.loadLibrary("E:\\VSProject\\JavaToCPP\\x64\\Debug\\JavaToCPP.dll",JavaToCS.class);

    /*需要调用的方法,方法名与c++方法名相同*/
   int add(int a,int b);
    int GetInt();
    float GetGobal();
}

 运行结果:

Java调用C#

        文章来源地址https://www.toymoban.com/news/detail-447130.html

到了这里,关于Java调用C#的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#调用C++类,托管C++方式实现(创建C++ CLR dll项目)

            由于C#编写的是托管代码,编译生成微软中间语言,而C++代码则编译生成本地机器码(这种C++也有叫做本地C++或者非托管C++,VC6.0就是用于开发非托管C++代码的平台),这两种语言进行混合编程就存在一定困难。比较常用的方法是使用DllImport的方法,这种方法在网

    2024年02月07日
    浏览(34)
  • java【毕业设计】项目-第118期基于SpringBoot+LayUI的视频播放网站(权限采用SpringSecurity)-计算机毕业设计

    java【毕业设计】项目-第118期基于SpringBoot+LayUI的视频播放网站(权限采用SpringSecurity) 【源码请到资源专栏下载】 Hi,大家好,今天分享的源码是《基于SpringBoot+LayUI的视频播放网站》。 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)下

    2023年04月10日
    浏览(35)
  • 为什么C#要采用顶级语句?

    前言 有群友问:为什么C#要采用顶级语句? .NET6发布后,C#10莫名引入了顶级语句,这是一种简化代码结构的语言特性。在此之前,C#程序必须包含一个入口点,通常是Main方法,然后在该方法中编写主要的程序逻辑。而使用顶级语句后,可以直接在文件的顶部编写执行代码,而

    2024年02月01日
    浏览(31)
  • 调用WebAPI的提示:由于远程方已关闭传输流,身份验证失败。

    这是我的API调用代码,然后一开始提示:由于远程方已关闭传输流,身份验证失败。 我以为是因为Https 的原因: 所以添加代码来忽略SSL证书但是还是不行 于是想想应该可能是http协议的问题 于是 问题成功解决 分析原因应该是.Net 4.6以下版本协议固定的原因,升级.Net框架版本

    2024年02月08日
    浏览(62)
  • C# FTP下载 采用Ssh.Net方式

    不要再用FTPClient了 nuget下载Ssh.Net 然后代码如下: 调用:

    2024年02月15日
    浏览(27)
  • 服务器无法调用gym中的render,采用Monitor保存视频的方法解决

    由于服务器上没有图形化界面,所以在调用gym中的 render() 函数时,会报错 pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to \\\"None\\\" 。 思路是:把视频保存下来,下载到本地再看。 直接调用 gym.wrappers.Monitor 把视频保存到本地 代码示例如下: outdir 为视频保存路径; video_callable 表

    2023年04月09日
    浏览(27)
  • SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

    章节 第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现) 第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现) 本节主要介绍的是springboot实现websocket的客户端服务端,以及客户端与服务端的数据互传。以下为伪代码,业务逻辑删除导致不

    2024年02月12日
    浏览(37)
  • C# 采用3DES-MAC进行签名 base64解码与编码

    ** ** 3DES-MAC(Triple Data Encryption Standard Message Authentication Code)是一种消息认证码(MAC)算法,用于验证消息的完整性和真实性。3DES-MAC使用了3DES(Triple Data Encryption Standard)加密算法的一部分来生成MAC值。以下是使用C#示例演示如何使用3DES-MAC签名一个消息: 首先,你需要确保在

    2024年02月09日
    浏览(31)
  • Java调用python项目(传参、不传参、服务器)

    一、无参数调用举例 创建一个python文件,写入如下代码: 创建一个Java文件 编写入如下代码(代码的意思已经添加注释) 3、结果如下说明运行成功 二、有参数时调用举例 1、创建Java文件并写入代码 2、创建python文件并写入代码 运行结果如下说明调用成功! 三、将Python脚本

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包