Mono(mono-config)

πŸ“¦
version 6.14.1 Β· 2 versions
, in alpine 3.24, epel 10, fedora 44, nixos 26.05, nixpkgs unstable, ubuntu resolute, ubuntu stonking

✨ NAME ✨

okay bestie, gather round, this is mono-config β€” the Mono runtime file format configuration πŸ’– and yes it's the manual page for Mono(mono-config), we love a self-titled moment.


🌸 DESCRIPTION 🌸

So here's the tea πŸ«–: the Mono runtime is gonna load its config data from the installation prefix /etc/mono/config file, or from ~/.mono/config, or from whatever file the MONO_CONFIG environment variable points at. Choose your fighter πŸ’…

Then, for every assembly that gets loaded, a config file named:

/path/to/the/assembly.exe.config

gets loaded too β€” plus this one:

~/.mono/assemblies/ASSEMBLY/ASSEMBLY.EXT.config

This file is literally the main character that controls how the runtime behaves πŸ‘‘

The file is an XML-like file with various sections, and all of them live inside a section (ngl it actually uses GMarkup to parse the file, that's the real mechanic πŸ”§).

This page is describing the Unix-specific and Mono-specific extensions to the config file β€” for the complete details you gotta go see the http://www.mono-project.com/Config web page. iykyk ✨


πŸ’œ <dllmap> directive

You use the dllmap directive to map shared libraries that are referenced by P/Invoke in your assemblies to a different shared library. it's giving translator energy 🌈

This is typically used to map Windows libraries over to Unix library names. The dllmap element takes two attributes:

  • dll β€” this should be the exact same string used in the DllImport attribute, optionally prefixed with "i:" to indicate that the string must be matched in a case-insensitive way πŸ™ˆ
  • target β€” this should be the name of the library where the function can actually be found. this name should be suitable for use with the platform native shared library loading routines (dlopen etc.), so like… you may wanna check the manpages for that too, bestie πŸ‘€

πŸ¦‹ <dllentry> directive

This directive can be used to map a specific dll/function pair to a different library and also a different function name. It should appear inside a dllmap element that has only the dll attribute specified. very specific of it, we respect it πŸ’…

The dllentry element takes 3 attributes:

  • dll β€” this is the target library, where the function can be found 🎯
  • name β€” this is the name of the function as it appears in the metadata: it's the name of the P/Invoke method ✨
  • target β€” this is the name of the function to look up instead of the name specified in the P/Invoke method πŸ”

πŸŽ€ Mapping based on operating system and cpu

Both the dllmap and the dllentry elements allow the following two attributes, which make it easy to use a single config file and support multiple operating systems and architectures with different mapping requirements. one file, many vibes, obsessed 😌

  • os β€” this is the name of the operating system for which the mapping should be applied. Allowed values are: linux, osx, solaris, freebsd, openbsd, netbsd, windows, aix, hpux.
  • cpu β€” this is the name of the architecture for which the mapping should be applied. Allowed values are: x86, x86-64, sparc, ppc, s390, s390x, arm, mips, alpha, hppa, ia64.
  • wordsize β€” this is the size of registers on the target architecture, it can be either 32 or 64.

The attribute value for both attributes can be a comma-separated list of the allowed values. Additionally, the first character may be a '!' to reverse the meaning πŸ™ƒ An attribute value of "!windows,osx", for example, would mean that the entry is considered on all operating systems, except on Windows and OS X. No spaces are allowed in any part of the value β€” not even one, periodt 🚫

⚠️ heads up bestie: note that later entries will override the entries defined earlier in the file. order matters, no cap πŸ’€

πŸ”₯ EXAMPLES πŸ”₯

The following example maps references to the cygwin1.dll shared library to the libc.so.6 file:

<configuration>
     <dllmap dll="i:cygwin1.dll" target="libc.so.6"/>
</configuration>

The library name in the DllImport attribute is allowed to be in any case variant, like the following examples:

[DllImport ("cygwin1.dll")]
[DllImport ("Cygwin1.dll")]
[DllImport ("cygwiN1.Dll")]

This one maps the following C# method:

[DllImport ("libc")]
static extern void somefunction ();

to differentfunction in libdifferent.so, but to the same function in the library libanother.so when running under the Solaris and FreeBSD operating systems πŸŒžπŸ¦‹

<configuration>
     <dllmap dll="libc">
          <dllentry dll="libdifferent.so" name="somefunction" target="differentfunction" />
          <dllentry os="solaris,freebsd" dll="libanother.so" name="somefunction" target="differentfunction" />
     </dllmap>
</configuration>

🌈 SEE ALSO 🌈


and that's the whole page, bestie β€” this was the Mono(mono-config) manual, stay configured and stay iconic πŸ‘‘πŸ’–