2012-06-15 2 views
0

Я знаю, что это три вопроса, но я не нашел точного ответа. У нас есть .Net dll (C#) без зависимостей или p/Invoke. Так что это полная библиотека платформы .net. Один из наших клиентов хочет использовать его в Java-приложении.Лучший выбор. Использовать .Net Dll в приложении Java

Какой лучший выбор? Я смотрю на jni4net, который может быть идеальным решением, но, похоже, не поддерживает дженерики в .Net (наша dll использует много дженериковых словарей и коллекций)

Это самый лучший выбор в JNA?

Заранее спасибо

ответ

4

У меня была аналогичная проблема несколько лет назад. У меня была dll, написанная в Delphi. (Delphi - инструмент разработки приложений для Windows, основанный на Паскале, продаваемый Borland.) Мне нужно было вызвать DLL из Java, но некоторые из функций dll имели параметры и возвращали типы, которые были несовместимы с Java. (Как интересный, если неважно, в стороне, Андерс Хейлсберг, который изобрел C# для Microsoft, также изобрел Delphi для Borland.) Вот как я решил проблему.

1) Я использовал jni, чтобы позволить Java-коду вызвать DLL.

2) Я написал тонкую оболочку dll в Delphi, которая была фактической dll, вызванной моим jni-кодом Java. Для тех функций, которые были полностью совместимы с Java, dll-оболочка просто выступала в качестве прохода, хотя напрямую вызывала фактические функции dll и возвращала возвращаемое значение. Для тех функций, которые были несовместимы, dll-оболочка определяла соответствующие методы, которые были совместимы с Java, и выполнял соответствующий перевод с Java на Delphi, прежде чем вызывать фактическую dll.

3) Я также написал тонкий оберточный объект над моими звонками jni. Опять же, по большей части, java-обертка непосредственно создавала jni-вызовы для тех функций, которые были полностью совместимы между Java и Delphi. Однако, в моем случае, некоторые функции требовали, чтобы я проходил в Delphi-объекты. Итак, что я сделал, это определить соответствующие объекты Java. Основная цель моего объекта оболочки Java заключалась в том, чтобы взять эти объекты Java, перевести их в параметры, которые были совместимы с моей DLL-оболочкой Delphi, а затем сделать подходящий jni-вызов. Кроме того, для тех функций dll, которые передавали объект назад, моя оболочка java приняла java-совместимое возвращаемое значение из jni-вызова и создала и смоделировала соответствующий объект.

Это может показаться большой работой, но на самом деле это не так (и у моей dll было более 100 методов и дюжина типов объектов Delphi). Когда я закончил, написав код приложения Java, который фактически использовал DLL, был очень прост.

Что касается дженериков, это может быть проблемой. Но, если в реальной жизни количество поддерживаемых типов объектов относительно невелико (и это часто бывает), вы можете просто написать отдельные вызовы для каждого типа объекта в вашей обертке. (Это то, что те из нас, кто помнил Java 2, раньше делали придумывание дженериков, и он работал отлично, даже если он был немного менее изящным.) В вашем приложении Java-код мог использовать дженерики; обертка сделает соответствующий вызов на основе фактического типа, который был передан.

Надеюсь, это даст вам несколько идей о том, как вы можете продолжить.

+0

объяснил Ну, это подобно моему собственному опыту, соединяющему между Delphi и Java. Я также использовал [JNA] (https://github.com/twall/jna) для соединения между DLL и C++ dll, и это может быть решение, как описано [здесь] (http://stackoverflow.com/questions/420617/доступ к внутрисетевому-DLL-библиотека-компонента-из-Java) – GrahamA

1

Чтобы использовать .NET DLL в JAVA, я бы сказал, что лучший выбор - использовать встроенный мост, такой как Javonet. С таким мостом все, что вам нужно сделать, это просто скопировать .NET dll в папку проекта JAVA и загрузить его одним вызовом метода и использовать объекты .NET, такие как JAVA-объекты. Вы пропустите всю основную часть и получите множество встроенных инструментов для преобразования типов данных, подписки на события, сборщика мусора, исключений и многих других.

Пример код для использования «Your.dll» может выглядеть следующим образом:

Javonet.addReference("Your.dll"); 
NObject yourDotNetObject = Javonet.New("MyDotNetClass"); 
yourDotNetObject.invoke("FooMethod", arg1, arg2); 

//out of the box you get also support for all types, arrays, generics etc 
yourDotNetObject.generic(Javonet.getType("String")).invoke("Foo", "sample"); 
//such code could call following .NET method passing String as T 
//void Foo<T>(T arg); 

Итак, как вы видите, с синтаксисом пола отражения вы получите доступ ко всему миру .NET, включая любые пользовательские библиотеки DLL или. NET. Руководство решение хорошо, а для обучения, то используя в реальном проекте, как это может занять больше времени, чтобы решить все проблемы, то весь ваши потребности проекта;)

Для более образцов проверить это: http://www.javonet.com/quick-start-guide/