Using panama with C# dll
Christoph Läubrich
laeubi at laeubi-soft.de
Tue Jun 20 04:05:00 UTC 2023
I also found that there is a similar attempt/request on gralvm with some
interesting links to parsers / compilers:
https://github.com/oracle/graal/issues/349
Am 19.06.23 um 12:58 schrieb Christoph Läubrich:
> Yes it feels it *should* be possible, but my FFM skills are currently to
> basic to wrap my head around it (especially method handles), so jextract
> is a great help and I wished something similar would be there for C#
> assemblies :-)
>
> About the conversions I think the basic primitives match quite well
> between Java and .net ad mono already offers UTf8 strings, so one is
> quite close here if one not expect a complete Object > Object mapping
> but something similar jextract generates to get/set struct members but
> for methods/properties.
>
> Am 19.06.23 um 12:29 schrieb Maurizio Cimadamore:
>> I see what you mean re. two indirections and pointer passing.
>>
>> When reading the Mono embedding doc, I noticed that libmono has
>> something that looks useful:
>>
>> https://www.mono-project.com/docs/advanced/embedding/#unmanaged-to-managed-thunks
>>
>> This allows to create a function pointer out of a mono method. Then
>> the pointer can be treated as a foreign call by the linker (e.g. you
>> can link against that pointer).
>>
>> It's a slightly less dynamic approach (and probably more efficient),
>> in that it allows, in principle, to define a library which can be used
>> to "lookup" Mono methods (this will create thunks), and then link
>> against them (using the linker).
>>
>> The biggest issue would remain to marshal/unmarhal args/returns to and
>> from Mono-land. But it seems like a useful library on top of the
>> Linker could be defined using these building blocks? (then of course,
>> one could also define a tool which uses said library to generate all
>> the MHs they need in one go, a la jextract).
>>
>> Maurizio
>>
>> On 19/06/2023 11:10, Christoph Läubrich wrote:
>>> Hi Maurizio,
>>>
>>> thanks for your input, yes I'm currently using libmono[2] to embed C#
>>> runtime and this is working to the basics but is of course a bit
>>> cumbersome because one has two indirection and each require some
>>> inconvenient pointer passing and method callings by string names:
>>>
>>> panama > libmono
>>> libmono > C#
>>>
>>> but as you can inspect the assembly for classes and methods and so
>>> on, there is also another approach with jni4net [4] that generates
>>> aJNI interface and according to their documentation it seems they are
>>> able to directly register using JNI#RegisterNatives [6].
>>>
>>> This makes me think that probably jextract could be made to work by
>>> using a C# assembly as an input and generate a binding with a nice
>>> java interface, there is also already IKVM [7] that is a JVM that
>>> exposes mono framework inside a JVM to javacode, so if this would
>>> work inside standard OpenJDK (maybe one would need a new JDK module
>>> jdk.sharp for the runtime) but maybe I'm just a bit too enthusiastic :-)
>>>
>>> And as both C# and Java are not that far apart (Object,s Exceptions,
>>> Reflection, Platform Independet Bytecode) it seems a good match to
>>> have some deeper inter-op.
>>>
>>> [4] https://github.com/jni4net/jni4net/tree/0.8.8.0
>>> [5]
>>> http://zamboch.blogspot.com/2009/11/how-calling-from-java-to-net-works-in.html
>>> [6]
>>> https://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp17734
>>> [7] https://www.mono-project.com/docs/about-mono/languages/java/
>>>
>>> Am 19.06.23 um 11:47 schrieb Maurizio Cimadamore:
>>>> I am not an expert on this topic (and I'd ask others to chime in
>>>> and/or validate the stuff below), but I'd assume that options to
>>>> call into a C# assembly are a bit limited (since a #NET assembly
>>>> doesn't use classic C ABI):
>>>>
>>>> * use a compiler that understands #NET (obviously great if you work
>>>> in visual studio)
>>>> * use COM (I have seen examples in this sense on this mailing list)
>>>> * use some 3rd party solution which allows to "export" symbols from
>>>> C# [1]
>>>> * try to find a way to embed a #NET runtime in your Java application
>>>> [2]
>>>>
>>>> I believe the dlls in the project you refer to are plain #NET
>>>> assemblies, so I don't think a regular (e.g. non-MSVC) compiler
>>>> would be able to do much with them - and that conclusion would
>>>> extend to the Linker API.
>>>>
>>>> Of these approaches, the last seem promising, as your Panama
>>>> application would interact not with the assembly directlty, but with
>>>> a library that implements the #NET functionalities (think of it as
>>>> some kind of JNI for #NET). From there, you have ways to obtain
>>>> references to #NET methods, and call them [3].
>>>>
>>>> Of course, I have not tried any of this :-)
>>>>
>>>> [1] - https://github.com/3F/DllExport
>>>> [2] - https://www.mono-project.com/docs/advanced/embedding/
>>>> [3] -
>>>> https://www.mono-project.com/docs/advanced/embedding/#invoking-methods-in-the-cil-universe
>>>>
>>>>
>>>> On 17/06/2023 13:24, Christoph Läubrich wrote:
>>>>> I'm wondering if anyone has already used panama with a c# DLL[2]?
>>>>>
>>>>> I especially came across this example [1] that says
>>>>>
>>>>> > The assemblies can be used to read RAW files on Windows, Linux,
>>>>> > and MacOS using C# or other languages that can acces a .Net assembly
>>>>>
>>>>>
>>>>> So I'm wondering if similar is possible using panama/java as well?
>>>>>
>>>>>
>>>>> [1] https://github.com/thermofisherlsms/RawFileReader
>>>>> [2]
>>>>> https://github.com/thermofisherlsms/RawFileReader/tree/main/libs/NetStandard20
More information about the panama-dev
mailing list