Неверный доступ к памяти 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), у меня возникают две проблемы:

  1. Сторонние сборки не могут быть найдены
  2. "Неверный доступ к памяти"

Я обошел первый пункт, зарегистрировав функцию обратного вызова сборки и вручную загрузив сборки с помощью Assembly.LoadFile (...), но не понимаю, почему при выполнении кода из сторонней библиотеки получить "Неверный доступ к памяти". Что-то подсказывает мне, что среда выполнения.NET инициализирована не полностью.

Любые мысли о том, что я делаю неправильно; или это дурацкое поручение, и мне стоит подумать о том, чтобы общаться вне процесса или использовать какой-нибудь сторонний инструмент, такой как JNBridge?

0 ответов

Другие вопросы по тегам