c # - System.UnauthorizedAccessException, når du forsøger at slette ustyrede biblioteker med ens tilladelser

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg spiller for øjeblikket med indlejring af ustyrede biblioteker i mit C # -program og derefter kopiere dem til en fil ved opstart som en måde at gøre appdistributionen meget ren med kun en enkelt biblioteksfil, som brugerne skal bekymre sig om.


Jeg gør dette med følgende trin:



  1. Ved opstart skal du kopiere den indlejrede ressource til en fil på disk i samme mappe som den eksekverbare.

  2. Brug et P/Invoke-opkald til LoadLibrary for at indlæse det og få et IntPtr håndtag til biblioteket til senere aflæsning.

  3. Kør biblioteket som sædvanligt, med C # bindingerne til de ustyrede biblioteker ved hjælp af de nyligt kopierede ustyrede biblioteker efter behov.

  4. Når applikationen afslutter, skal du ringe FreeLibrary ved hjælp af IntPtr-håndtagene fra opstart, og slet derefter de ustyrede biblioteker ud af disken. Fordi jeg sletter filerne, skal jeg ikke kun nedbringe referencenumrene fra LoadLibrary, men også fra DllImport, hvilket betyder, at jeg har to opkald til FreeLibrary, før filerne slettes, som forklaret her.



Specifikt bruger jeg Windows-binærerne til SDL2 og OpenAL Soft og indlæser dem til brug med SDL2-CS og OpenAL-CS. [9] [10] [11]


Jeg får dog en UnauthorizedAccessException, når du sletter en af ​​de ustyrede biblioteker, men ikke den anden med meddelelsen 'Adgang til sti nægtes'. Specielt sletter SDL2-biblioteket slukket uden hitch, men sletning af OpenAL-biblioteket giver undtagelsen. Begge biblioteker kopieres på samme måde, og jeg har sørget for, at det ikke er læseligt eller skjult med et opkald til File.SetAttributes(path, FileAttributes.Normal); både efter den oprindelige kopi og før filens sletning. Desuden har jeg kontrolleret sikkerhedsindstillingerne på begge filer, og de har samme tilladelser for alle grupper og brugere.


Min eneste tanke var måske, at der var en ekstra henvisning til OpenAL et sted, men med stigende opkald til FreeLibrary (op til 10.000 opkald) forblev problemet, så jeg taber nu hvad der kunne ske. Undtagelsen kastet har ingen InnerException, så der er ingen yderligere oplysninger til at hjælpe mig der heller.


EDIT: Min nuværende løsning er bare at forlade de ustyrede biblioteker i mappen uden at slette dem. Ansøgningen kan derefter overskrive dem ved opstart efter behov, hvilket også løser problemet med at bruge nyere biblioteksversioner i fremtiden. Jeg er helt glad for at fortsætte med denne løsning, da det ser ud til at fungere fint. Dette spørgsmål er mere fordi jeg er forvirret/nysgerrig over, hvad der kunne forårsage fejlen, og ville sætte pris på en løsning, hvis det var muligt.

Bedste reference