困っていること
MemoryMappedFileをWindowsアプリとWebアプリで共有しようとしています。
それぞれ単独で動かしたときには良いのですが、アプリ→Webの順に実行しようとすると
MemoryMappedFile.CreateOrOpenのところで、UnauthorizedAccessExceptionになります。
逆順に実行すると問題ないので最悪起動順に気をつければいいのですが、なぜ後からWebを実行するとダメなのか
原因がよくわかりません。
試した条件
- MyApp.exe:
・.NET Framework 4.7.2
・MyDll.dll参照
・管理者権限で実行
- MyWeb:
・Asp.NET Core 2.1
・.NET Framework 4.7.2
・MyDll.dll参照
・管理者権限で実行
- MyDll.dll:
・.NET Framework 4.7.2
・MemoryMappedFile作成、開くクラスが存在
MyDll.dll: MyApp.exe, MyWeb共通で呼び出しているメソッド
lang
1public void CreateOrOpenSharedMemory(string name, int capacity) { 2 var mmf = MemoryMappedFile.CreateOrOpen($@"Global\{name}", capacity); 3 var stream = mmf.CreateViewStream(); 4}
試した結果
結果1) MyApp.exe -> MyWebの順で実行。
System.UnauthorizedAccessException: パスへのアクセスは拒否されました。 場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpenCore(SafeFileHandle fileHandle, String mapName, HandleInheritability inheritability, MemoryMappedFileSecurity memoryMappedFileSecurity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, Int64 capacity) 場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpen(String mapName, Int64 capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability) 場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpen(String mapName, Int64 capacity)
結果2) MyWeb -> MyApp.exeの順で実行
→問題なく起動、動作。
追記
コメントいただいたので追記します。
まさに業務で使おうとしています…
- WindowsAppが元々あり、MemoryMappedFileを使ったdllがあります。
- このWindowsAppの一部機能をWebApp化する要望があります。
- この一部機能を実現するためにMemoryMappedFileを使ったdllを使う必要があります。
MemoryMappedFileを使ったdllはとある情報を保持しており、この情報はWindowsAppからも
WebAppからも更新され共有する必要があります。
追記2' アクセス権追加
everyoneに権限を追加してみたところ、CreateOrOpen時の例外は回避されました。
lang
1MemoryMappedFileSecurity customSecurity = new MemoryMappedFileSecurity(); 2customSecurity.AddAccessRule( 3 new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>( 4 "everyone", MemoryMappedFileRights.FullControl, 5 System.Security.AccessControl.AccessControlType.Allow)); 6 7// m_MemoryMappedFile = MemoryMappedFile.CreateOrOpen(name, capacity); 8m_MemoryMappedFile = MemoryMappedFile.CreateOrOpen( 9 $@"Global\{name}", capacity, 10 MemoryMappedFileAccess.ReadWrite, 11 MemoryMappedFileOptions.None, 12 customSecurity, 13 System.IO.HandleInheritability.Inheritable);
回答2件
あなたの回答
tips
プレビュー