oraios/serena · error · SolidLSPException

Roslyn Language Server DLL not found after extraction

Error message

Roslyn Language Server DLL not found after extraction

What it means

Raised by _ensure_language_server after the Roslyn NuGet package was downloaded and extracted, but the expected Microsoft.CodeAnalysis.LanguageServer DLL still does not exist in the target directory. It means extraction succeeded at the filesystem level but did not place the server DLL where the code expects it.

Source

Thrown at src/solidlsp/language_servers/csharp_language_server.py:422

            package_version = lang_server_dep.package_version

            server_dir = Path(self._ls_resources_dir) / f"{package_name}.{package_version}"
            assert lang_server_dep.binary_name is not None
            server_dll = server_dir / lang_server_dep.binary_name

            if server_dll.exists():
                log.info(f"Using cached Roslyn Language Server from {server_dll}")
                return str(server_dll)

            # Download and install the language server
            log.info(f"Downloading {package_name} version {package_version} from NuGet.org...")
            package_path = self._download_nuget_package(lang_server_dep)

            # Extract and install
            self._extract_language_server(lang_server_dep, package_path, server_dir)

            if not server_dll.exists():
                raise SolidLSPException("Roslyn Language Server DLL not found after extraction")

            # Make executable on Unix systems
            if platform.system().lower() != "windows":
                server_dll.chmod(0o755)

            log.info(f"Successfully installed Roslyn Language Server to {server_dll}")
            return str(server_dll)

        @staticmethod
        def _extract_language_server(lang_server_dep: RuntimeDependency, package_path: Path, server_dir: Path) -> None:
            """Extract language server files from downloaded package."""
            extract_path = lang_server_dep.extract_path or "lib/net9.0"
            source_dir = package_path / extract_path

            if not source_dir.exists():
                # Try alternative locations
                for possible_dir in [
                    package_path / "tools" / "net9.0" / "any",

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Delete the language-server cache/resources directory and re-run to force a clean download+extraction
  2. Check logs for the extraction step and verify the package version in the runtime dependency matches a known-good layout
  3. Manually inspect the extracted package contents to confirm where the DLL landed
  4. Upgrade the library if the upstream package layout changed and needs updated extraction logic

Example fix

// before
rm -rf <ls_resources_dir>/microsoft.codeanalysis.languageserver*
// after: rerun; verify
find <server_dir> -name 'Microsoft.CodeAnalysis.LanguageServer*.dll'
Defensive patterns

Strategy: retry

Validate before calling

from pathlib import Path
server_dir = Path(ls_resources_dir) / "roslyn"
dll = next(server_dir.rglob("Microsoft.CodeAnalysis.LanguageServer*.dll"), None)
if dll is None:
    print("Roslyn DLL missing; clearing cache and reinstalling")
    import shutil; shutil.rmtree(server_dir, ignore_errors=True)

Type guard

def roslyn_dll_present(server_dir) -> bool:
    from pathlib import Path
    return any(Path(server_dir).rglob("Microsoft.CodeAnalysis.LanguageServer*.dll"))

Try / catch

try:
    ls._ensure_server_installed()
except SolidLSPException as e:
    if "DLL not found after extraction" in str(e):
        shutil.rmtree(server_dir, ignore_errors=True)
        ls._ensure_server_installed()  # clean reinstall
    else:
        raise

Prevention

When it happens

Trigger: _ensure_server_installed -> _ensure_language_server when, after _download_nuget_package + _extract_language_server, server_dll.exists() is False — e.g. package layout changed upstream, extraction picked the wrong source dir, or a stale/corrupted cache was partially populated.

Common situations: A new Roslyn language server package version restructured its content directories, corrupted NuGet downloads, long-path issues on Windows truncating extraction, or leftover cache dirs from a previous failed install.

Related errors


AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29). Data as JSON: /api/errors/fc80a403ec2300e4. Report an issue: GitHub.