razzmatazz / csharp-language-server

Roslyn-based LSP language server for C#
MIT License
613 stars 41 forks source link
csharp lsp-server

Description

This is a hacky Roslyn-based LSP server for C#, as an alternative to omnisharp-roslyn.

csharp-ls requires .NET 8 SDK to be installed. However it has been reported to work with projects using older versions of dotnet SDK, including .NET Core 3, .NET Framework 4.8 and possibly older ones too as it uses the standard Roslyn/MSBuild libs that Visual Studio & omnisharp does.

See CHANGELOG.md for the list of recent improvements/fixes.

Acknowledgements

Installation

dotnet tool install --global csharp-ls

See csharp-ls nuget page

Settings

Clients

csharp-ls implements the standard LSP protocol to interact with your editor. However there are some features that need a non-standard implementation and this is where editor-specific plugins can be helpful.

Emacs

emacs/lsp-mode

Supports automatic installation, go-to-metatada (can view code from nuget/compiled dlls) and some additional features.

See emacs/lsp-mode.

Visual Studio Code

vytautassurvila/vscode-csharp-ls

See csharp-ls and vscode-csharp-ls @ github.

statiolake/vscode-csharp-ls

See vscode-csharp-ls.

Building

On Linux/macOS

$ dotnet build

FAQ

decompile for your editor , with the example of neovim

api

The api is "csharp/metadata", in neovim ,you can request it like

  local result, err = client.request_sync("csharp/metadata", params, 10000)

sender

You need to send a uri, it is like

csharp:/metadata/projects/trainning2/assemblies/System.Console/symbols/System.Console.cs

In neovim, it will be result(s) from vim.lsp.handles["textDocument/definition"]

and the key of uri is the key,

The key to send is like

local params = {
    timeout = 5000,
    textDocument = {
        uri = uri,
    }
}

The key of textDocument is needed. And timeout is just for neovim. It is the same if is expressed by json.

receiver

The object received is like

{
    projectName = "csharp-test",
    assemblyName = "System.Runtime",
    symbolName = "System.String",
    source = "using System.Buffers;\n ...."
}

And In neovim, You receive the "result" above, you can get the decompile source from


local result, err = client.request_sync("csharp/metadata", params, 10000)
local source
if not err then
    source = result.result.source   
end

And there is a plugin of neovim for you to decompile it.

csharpls-extended-lsp.nvim