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