在 Java 程序中调用 C# 方法

2022-09-04 04:09:43

由于不同的原因,不能使用 JNI 在 Java 中直接调用 C# 方法。因此,首先我们必须使用C++为C#编写一个包装器,然后创建dll并通过Java中的JNI使用它。

我在C++调用C#代码时遇到问题。我正在将 C# 文件添加到C++项目。代码粘贴在下面。如果我做错了什么,请指导我。.netmodule

这是我的托管C++类:UsbSerialNum.h

#using <mscorlib.dll>
#include <iostream>
#using "UsbSerialNumberCSharp.netmodule"

using namespace std;

using namespace System;

public __gc class UsbSerialNum
{
    public:

        UsbSerialNumberCSharp::UsbSerialNumberCSharp __gc *t;

        UsbSerialNum() {
            cout<<"Hello from C++";
            t = new UsbSerialNumberCSharp::UsbSerialNumberCSharp();
        }

        void CallUsbSerialNumberCSharpHello() {
            t->hello();
        }
};

我从中创建文件的C#文件:UsbSerialNumberCSharp.cs.netmodule

using System.Collections.Generic;
using System.Text;

namespace UsbSerialNumberCSharp
{
    public class UsbSerialNumberCSharp
    {

        public UsbSerialNumberCSharp(){
            Console.WriteLine("hello");
        }

        public static void hello()
        {
            Console.WriteLine("hello");
        }

        public void helloCSharp ()
        {
            Console.WriteLine("helloCSharp");
        }
    }
}

这是我的主文件,从中创建:makeDLL.cppmakeDLL.dll

#include "jni.h"
#include <iostream>


// This is the java header created using the javah -jni command.
#include "testDLL.h"


// This is the Managed C++ header that contains the call to the C#
#include "UsbSerialNum.h"

using namespace std;


JNIEXPORT void JNICALL Java_testDLL_hello
(JNIEnv *, jobject) {

    // Instantiate the MC++ class.
    UsbSerialNum* serial = new UsbSerialNum();
    serial->CallUsbSerialNumberCSharpHello();
}

这是我的java类:

public class testDLL {

    static {
        System.loadLibrary("makeDLL");
    }

    /**
     * @param args
     */
    public static void main (String[] args) {
        //        new testDLL().GetUSBDevices("SCR3", 100);
        new testDLL().hello();
    }

    public native void hello();

}

编辑:

如果我简单地忽略在我的主文件中对UsbSerial.h的调用,即使用简单的C++那么我的代码在Java中工作正常。基本上C++托管类无法正常工作。请指导我。谢谢。


答案 1

确切地知道您需要这种互操作性是很有用的。无论如何,您应该研究IKVM;或者,您可以(正如类似问题所建议的那样)使用COM作为桥梁:将C#/CLR公开为COM接口,然后在Java中使用com4j


答案 2

可以避免使用 C#,但仍只能使用 C++ 查询 WMI。请参见使用 WMI 在对象上调用方法


推荐