fix: Mark of the Web von den .NET-DLLs entfernen (ZIP aus dem Internet startete nicht)
This commit is contained in:
@@ -18,9 +18,30 @@ class WebView2Unavailable(RuntimeError):
|
||||
"""WebView2 konnte nicht geladen werden (DLLs oder Runtime fehlen)."""
|
||||
|
||||
|
||||
def _app_base_dir() -> Path:
|
||||
return Path(getattr(sys, "_MEIPASS", Path(__file__).resolve().parent.parent))
|
||||
|
||||
|
||||
def _vendor_dir() -> Path:
|
||||
base = Path(getattr(sys, "_MEIPASS", Path(__file__).resolve().parent.parent))
|
||||
return base / "vendor" / "webview2"
|
||||
return _app_base_dir() / "vendor" / "webview2"
|
||||
|
||||
|
||||
def _unblock_downloaded_files(folders: tuple[Path, ...]) -> None:
|
||||
"""Entfernt die "Mark of the Web" (Zone.Identifier) von den DLLs, die .NET laden soll.
|
||||
|
||||
Wer die ZIP aus dem Internet laedt und entpackt, bekommt alle Dateien mit dieser
|
||||
Markierung; .NET verweigert dann das Laden von Python.Runtime.dll ("Failed to resolve
|
||||
Python.Runtime.Loader.Initialize"). Die Dateien liegen im eigenen App-Ordner - das
|
||||
Entfernen der Markierung betrifft nur sie."""
|
||||
if os.name != "nt":
|
||||
return
|
||||
for folder in folders:
|
||||
for path in folder.rglob("*"):
|
||||
if path.suffix.lower() in (".dll", ".exe"):
|
||||
try:
|
||||
os.remove(f"{path}:Zone.Identifier")
|
||||
except OSError:
|
||||
pass # keine Markierung vorhanden (Normalfall) oder Dateisystem ohne Datenstroeme
|
||||
|
||||
|
||||
@lru_cache(maxsize=1)
|
||||
@@ -32,6 +53,9 @@ def load() -> SimpleNamespace:
|
||||
if not core_dll.exists() or not winforms_dll.exists():
|
||||
raise WebView2Unavailable(f"WebView2-DLLs fehlen in {vendor}")
|
||||
|
||||
base = _app_base_dir()
|
||||
_unblock_downloaded_files((vendor, base / "pythonnet", base / "clr_loader"))
|
||||
|
||||
# WebView2Loader.dll (nativ) wird ueber den Suchpfad bzw. runtimes/win-x64/native gefunden.
|
||||
os.environ["PATH"] = f"{vendor}{os.pathsep}{os.environ.get('PATH', '')}"
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user