почему я получаю исключение отказа в доступе при доступе к файлу с отображением памяти из С#, но не из С++

У меня есть служба WCF, которая использует именованные каналы. По-видимому, не использует URL-адрес для имени. Он генерирует GUID из URL-адреса, а затем сохраняет его в файле с отображением памяти. Поэтому я написал приложение на C++, которое получает имя канала из файла отображения памяти, и оно отлично работает. Теперь я пытаюсь создать приложение С#, которое получает имя канала из файла с отображением памяти. вот код, который я использую.

    private static string GetPipeName(string mappedFileName)
    {
        var mappedFile = MemoryMappedFile.OpenExisting(mappedFileName, MemoryMappedFileRights.Read);
        var bytes = new List<byte>();
        using (MemoryMappedViewStream s = mappedFile.CreateViewStream())
        {
            using (var b = new BinaryReader(s))
            {
                bytes = b.ReadBytes((int)b.BaseStream.Length).ToList();
            }

        }
        var sb = new StringBuilder();
        foreach (var b in bytes)
        {
            sb.Append(b.ToString("x2"));
            sb.Append(" ");
        }
        Console.WriteLine(sb.ToString());
        return sb.ToString();
    }

В первом заявлении using я получаю исключение UnauthorizedAccessException, в котором говорится: «Доступ к пути запрещен».

Я смог пройти и подтвердить, что имя файла такое же, как и в приложении С++, и это видно, когда я использую инструмент SysInternals Handle.exe.

Почему приложению С# может быть отказано в доступе? Насколько я могу судить, оба работают от одного и того же пользователя.


person scott    schedule 03.08.2012    source источник
comment
Скотт ... можете ли вы уточнить ошибку ... также может быть ошибка доступа, потому что кажется, что файл, который вы пытаетесь прочитать, может использоваться другим процессом, что означает, что вы не закрываете поток   -  person MethodMan    schedule 03.08.2012
comment
похоже, у вас проблема с ViewAccessor   -  person MethodMan    schedule 03.08.2012
comment
@DJKRAZE - я обновил вопрос, чтобы включить более точную информацию об исключении. это чуть ниже примера кода.   -  person scott    schedule 03.08.2012
comment
так должен ли я использовать метод CreateViewAccessor вместо CreateViewStream?   -  person scott    schedule 03.08.2012
comment
Проверьте эту ссылку и прокрутите вниз до ответа.. человек опубликовал 2 рабочих примера.. Я уверен, что вы могли бы добавить/удалить, чтобы он работал для вашего примера. stackoverflow.com/ вопросы/10390829/   -  person MethodMan    schedule 03.08.2012
comment
Я использовал метод CreateViewAccessor(Int64, Int64, MemoryMappedFileAccess). и это сработало. если вы хотите ответить, я приму его, так как я бы и не подумал попробовать, если бы не ваш комментарий.   -  person scott    schedule 03.08.2012
comment
Я сделаю это ответом, спасибо и рад, что смог помочь   -  person MethodMan    schedule 03.08.2012


Ответы (1)


вам нужно использовать следующее

CreateViewAccessor(Int64, Int64, MemoryMappedFileAccess);
person MethodMan    schedule 03.08.2012