0

Isis2 ライブラリの新しいバージョンを Windows 上の .NET から Mono/Linux に移植しようとしています。この新しいコードは MemoryMappedFile オブジェクトを使用しており、Mono.Posix.Helper ライブラリで突然問題が発生しています。次のテスト プログラムを正常にコンパイルして実行できれば、問題は解決すると思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.MemoryMappedFiles;

namespace foobar
{
  class Program
  {
    static int CAPACITY = 100000;
    static void Main(string[] args)
    {
        MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", CAPACITY);
        MemoryMappedViewAccessor mva = mmf.CreateViewAccessor();
        for (int n = 0; n < CAPACITY; n++)
        {
            byte b = (byte)(n & 0xFF);
            mva.Write<byte>(n, ref b);
        }
    }
  }
}

... 現在、これを Mono でコンパイルしようとすると、当惑するような一連のリンカー エラーが発生します。私の LD_LIBRARY_PATH には、そのファイルを含むディレクトリが含まれていますが、libMonoPosixHelper.so が見つからないようです。その段階で、「System.NotImplementedException: 要求された機能が実装されていません」というメッセージが表示されます。実行時に。しかし、CreateNew メソッドの Mono 実装を見てきました。完全に実装されているようで、CreateViewAccessor メソッドについても同じことが言えます。このように、Mono ライブラリにリンクするときに何かがうまくいかないような気がします。

Mono で MemoryMappedFile オブジェクトを使用した経験のある人はいますか? ここや他のサイトでこの種の問題についてかなりの数の質問を見かけますが、すべて古いスレッドのようです...

4

1 に答える 1

3

OK、この API を実装する Mono コードを調べて、少なくともその一部を理解しました。実際、彼らは .NET API から大幅に逸脱した方法で CreateNew を実装したため、これらのメソッドの動作が予想とは大きく異なっていました。

CreateNew の場合、実際には、指定したファイル名が、指定した容量と少なくとも同じサイズの既存の Linux ファイルの名前である必要があり、アクセス許可 (もちろん)、排他的アクセス (これは共有とは相容れません...)そして、要求した容量が> 0であることを確認します。したがって、ファイルを以前に開いていた場合、または他の誰かが開いている場合、これは失敗します-明示的に使用する.NETとは対照的です共有用のメモリ マップト ファイル。

対照的に、CreateOrOpen は「多かれ少なかれ」正しく実装されているように見えます。このバージョンに切り替えると、問題が解決するようです。CreateNew の効果を得るには、最初に Delete を実行し、それを try/catch でラップして、ファイルが存在しない場合に IOException をキャッチします。次に、File.WriteAllBytes を使用して、目的のコンテンツを含むファイルを作成します。次に、CreateOrOpen を呼び出します。これはばかげているように聞こえますが、機能します。明らかに、この方法 (1 つではなく 3 つの操作) でアトミック性を保証することはできませんが、少なくとも目的の機能は得られます。

私はこれらの制限にうまく対処できますが、他の人を驚かせる可能性があり、MemoryMappedFile の .NET API 定義とはまったく異なります。

私のリンクの問題に関しては、指定した LD_LIBRARY_PATH を Mono が使用しないため、使用した .so ファイルまたは .dll ファイルが見つからないという状況があることがわかります。状況を正確に突き止めることができれば、これについてさらに投稿します。これについては、ライブラリに静的にリンクすることで問題を回避しました。

于 2013-08-15T17:46:51.900 に答える