У меня есть служба 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.
Почему приложению С# может быть отказано в доступе? Насколько я могу судить, оба работают от одного и того же пользователя.