Неверный доступ к памяти Java -> C# через неуправляемый экспорт и JNA
У меня есть C# DLL, к которой я хотел бы получить доступ из приложения Java. Я настроил JNA на стороне Java, получая доступ к экспорту в стиле C со стороны.NET с помощью неуправляемого экспорта:
Java-код - тестовый интерфейс
package com.somecompany;
import com.sun.jna.Library;
interface Test extends Library {
void someMethod(String data);
}
Java-код - основной класс
package com.somecompany;
import com.sun.jna.Native;
public class Main {
private static Test INSTANCE;
private static synchronized Test getInstance() {
if (INSTANCE == null) {
INSTANCE = (Test) Native.loadLibrary("MyDLL", Test.class);
}
return INSTANCE;
}
public static void main(String[] args) {
getInstance().someMethod("hello world");
}
}
Код C#
using log4net.Appender;
using log4net.Config;
using RGiesecke.DllExport;
using System;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace SomeNameSpace
{
class Test
{
[DllExport]
public static void someMethod(string data)
{
System.Console.Out.WriteLine("Native method: data=\"" + data + "\"");
//IAppender console = new ConsoleAppender();
//BasicConfigurator.Configure(console);
} catch (Exception ex)
{
System.Console.Out.WriteLine("Exception configuring native logging: exception=\"" + ex.Message + "\"");
}
}
}
}
Все отлично работает; Я могу создавать объекты на стороне.NET и возвращать примитивные типы обратно в Java. Однако, когда я пытаюсь использовать сторонние сборки.NET (см.Log4net), у меня возникают две проблемы:
- Сторонние сборки не могут быть найдены
- "Неверный доступ к памяти"
Я обошел первый пункт, зарегистрировав функцию обратного вызова сборки и вручную загрузив сборки с помощью Assembly.LoadFile (...), но не понимаю, почему при выполнении кода из сторонней библиотеки получить "Неверный доступ к памяти". Что-то подсказывает мне, что среда выполнения.NET инициализирована не полностью.
Любые мысли о том, что я делаю неправильно; или это дурацкое поручение, и мне стоит подумать о том, чтобы общаться вне процесса или использовать какой-нибудь сторонний инструмент, такой как JNBridge?