<div dir="ltr">Re-reading your original question makes me wonder if you really need something as heavy handed as the approach on Mono.Posix.<div><br></div><div>The challenge that Mono.Posix faces is that the structures exposed in each Unix is slightly different (different location for fields, different data types for fields), so Mono.Posix resorts to defining its own interface, say instead of using "struct stat" and trying to have one universal implementation that works across many different Unix systems - it instead defines a "struct MyStat" which has well known fields at well known locations with well known sizes. </div><div><br></div><div>Then the C glue maps between those two.</div><div><br></div><div>But in your case, it is not clear if you are trying to bind libc and their structures, or trying to bind your own C library that already has a stable ABI.  If you are coping with the latter, you do not need a setup as tedious as the one that Mono.Posix does, you merely need to ship your native library for each platform you intend to support and your C# code that calls into it.</div><div><br></div><div>Miguel</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 31, 2015 at 8:15 PM, Jason Curl <span dir="ltr"><<a href="mailto:jcurlnews@arcor.de" target="_blank">jcurlnews@arcor.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Thank you Mr. Icaza.<br>
    <br>
    Is there more information on what uses the MapAttribute than what's
    in Syscall.cs? Even though it's internal and I won't use it, I'd
    like to understand how you solve the problem of ABI compatibility.<br>
    <br>
    I'd like to set up a solution where copying the files from one
    architecture to another simply works (assuming all dependencies from
    the runtime are present), and the runtime/mylib chooses the most
    appropriate native library (based on OSVersion and Syscall.uname)
    for all supported platforms. Something like:<br>
    * MyLib.dll (assembly)<br>
    * <a href="http://MyNativeLib.Linux.x86.so" target="_blank">MyNativeLib.Linux.x86.so</a><br>
    * <a href="http://MyNativeLib.Linux.x64.so" target="_blank">MyNativeLib.Linux.x64.so</a><br>
    * <a href="http://MyNativeLib.FreeBSD.x86.so" target="_blank">MyNativeLib.FreeBSD.x86.so</a><br>
    * <a href="http://MyNativeLib.Darwin.x86.so" target="_blank">MyNativeLib.Darwin.x86.so</a><br>
    * MyNativeLib.Win.x86.dll (windows native)<br>
    * MyNativeLib.Win.x64.dll (windows native)<br>
    * MyNativeLib.[dll|so] (backup for local builds)<br>
    <br>
    Your solution (Mono.Unix.Native) looks different, more compact, but
    I'm not sure if/how it supports side-by-side. My solution requires a
    lot of work, duplicate code with small changes in defining the
    structs/DllImports with different offsets and library names.<br>
    <br>
    I've yet to look into the Dll mapping mechanism of Mono if that's
    also suitable.<br>
    <br>
    Thank you very much and for giving me the opportunity to use Mono.<br>
    <br>
    Regards,<br>
    Jason.<div><div class="h5"><br>
    <br>
    <div>On 2015-12-31 02:04, Miguel de Icaza
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">For something like libc, you can use an approach
        similar to what Mono.Posix does, where an intermediate C glue
        file acts as a bridge between the API differences.
        <div><br>
        </div>
        <div>See the P/Invokes for the Mono.Posix assembly, and its
          supporting glue code in mono/support/</div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Wed, Dec 30, 2015 at 5:58 AM, Jason
          Curl <span dir="ltr"><<a href="mailto:jcurlnews@arcor.de" target="_blank">jcurlnews@arcor.de</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
            <br>
            I'm investigating the best way on how to support
            multiplatform software especially when using P/Invokes, but
            have not found any reasonable advice on the Wiki.<br>
            <br>
            Can someone point to me on how to handle different
            architectures, especially when the underlying libc might use
            different structures or API signatures?<br>
            <br>
            Thanks,<br>
            Jason.<br>
            _______________________________________________<br>
            Mono-devel-list mailing list<br>
            <a href="mailto:Mono-devel-list@lists.ximian.com" target="_blank">Mono-devel-list@lists.ximian.com</a><br>
            <a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" rel="noreferrer" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
  </div></div></div>

<br>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" rel="noreferrer" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
<br></blockquote></div><br></div>