Вызов метода С# в программе Java
Методы С# не могут быть вызваны непосредственно на Java с использованием JNI по разным причинам. Итак, сначала мы должны написать обертку для С# с использованием С++, затем создать DLL и использовать ее через JNI в Java.
У меня проблема с вызовом кода С# в С++. Я добавляю файл С# .netmodule
в проект С++. Код вставлен ниже. Пожалуйста, направляйте меня, если я что-то делаю неправильно.
Это мой управляемый класс С++ 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();
}
};
С# 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.cpp
, из которого создан makeDLL.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();
}
EDIT:
Если я просто игнорирую вызов UsbSerial.h в моем основном файле, то я использую простой С++, тогда мой код отлично работает на Java. В основном управляемый класс С++ работает неправильно.
Пожалуйста, направляйте меня. Спасибо.
Ответы
Ответ 1
Было бы полезно узнать, для чего вам нужна эта интероперабельность. В любом случае вы должны изучить IKVM; альтернативно вы можете (как было предложено для аналогичной проблемы) использовать COM в качестве моста: выставить С#/CLR в качестве COM-интерфейса, а затем использовать com4j в Java.
Ответ 2
Вы можете избежать С# и все еще можете запросить WMI только с помощью С++. См. Использование WMI для вызова метода на объектах