Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add zed-netcoredbg to csharp extension, add runnables - #43

Open
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables
Open

Add zed-netcoredbg to csharp extension, add runnables#43
Tiggilyboo wants to merge 4 commits into
zed-extensions:mainfrom
Tiggilyboo:feature/netcoredbg-and-runnables

Conversation

@Tiggilyboo

Copy link
Copy Markdown

This PR adds debugging support #12 as originally implemented by https://github.com/qwadrox/zed-netcoredbg I merged this code over for debug use. It uses netcoredbg: https://github.com/Samsung/netcoredbg

My PR adds runnables which detect test files, so test fixtures and individual tests can be run or debugged.
netcoredbg_csharp_test_running

There is however one caveat, I can't seem to find a way to properly attach to the running test pid as we cannot inspect the process from within the extension. As seen in the screenshot below, the user can read and manually attach to the process id in the current implementation until a better solution is found. The only other way I can think of at the moment is to run the tests and output a temporary file which can be read by the extension, or somehow get the tcp connection working.

netcoredbg_csharp_test_showing_pid

Open to other ideas, but at least this is one step forward to integrated test runnables from the csharp extension...

From my git commit log for more details:

  • Use extension from https://github.com/qwadrox/zed-netcoredbg to have basic debug functionality with DAP and download netcoredbg for the running platform.
  • Add runnables and tasks to debug from test files. Captures for nunit, xunit, vstest. Not strict, purely functional (does not pair keywords) to test framework.
  • Currently unable to fully attach to runnable, but starts the vstest process so that it can be easily attached with PID listed in console

@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from caf692f to 05e68e6CompareDecember 22, 2025 22:17
@cla-bot

cla-botBot commented Dec 22, 2025

Copy link
Copy Markdown

Thank you for your pull request and welcome to our community. We could not parse the GitHub identity of the following contributors: Simon Willshire.
This is most likely caused by a git client misconfiguration; please make sure to:

  1. check if your git client is configured with an email to sign commits git config --list | grep email
  2. If not, set it up using git config --global user.email email@example.com
  3. Make sure that the git commit email is configured in your GitHub account settings, see https://github.com/settings/emails

@Sathiyaraman-M

Sathiyaraman-M commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

@Tiggilyboo

Copy link
Copy Markdown
Author

Just wanted to mention that netcoredbg isn't officially supported in MacOS for ARM architecture.

Yea, was made aware of this asking permission from the zed-netcoredbg repository: qwadrox/zed-netcoredbg#6 (comment)

Currently the extension pulls from the netcoredbg releases which builds this, but ideally we do not pull from there...

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

@Sathiyaraman-M

Copy link
Copy Markdown
Contributor

Is it a hard requirement that the debugging extension works with all zed targets? ie. Get this one through with a "MacOS aarch64 is not supported at the moment"?

As long as it falls back gracefully in MacOS ARM64 devices, it should be fine. Also having an explicit note on this somewhere in the extension README would be nice.

@brendanmckenzie

Copy link
Copy Markdown

Not sure if it helps, but I've created a fork of the Samsung repo that keeps itself in sync with the upstream and automatically triggers builds of new releases. It builds for linux-x64, linux-arm64, macos-x64, macos-arm64 and win64.

See https://github.com/brendanmckenzie/netcoredbg/releases

@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from 05e68e6 to a78b794CompareFebruary 3, 2026 08:14
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

- Use extension from https://github.com/qwadrox/zed-netcoredbg to
have basic debug functionality with DAP and download netcoredbg for
the running platform.
- Add runnables and tasks to debug from test files. Captures for nunit,
xunit, vstest. Not strict, purely functional (does not pair keywords)
to test framework.
- Currently unable to fully attach to runnable, but starts the vstest
process so that it can be easily attached with PID listed in console
@Tiggilyboo
Tiggilybooforce-pushed the feature/netcoredbg-and-runnables branch from a78b794 to 43052c0CompareFebruary 3, 2026 08:18
@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@Tiggilyboo

Copy link
Copy Markdown
Author

Have sorted the faff with git email and signed the cla... Hopefully.

@cla-bot check

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @Tiggilyboo on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot

cla-botBot commented Feb 3, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@Tiggilyboo
Tiggilyboo marked this pull request as ready for review February 3, 2026 08:21
@reflectronicreflectronic self-assigned this Feb 4, 2026
@Dakota-LM

Copy link
Copy Markdown

Any eta on this getting merged? I'm literally just cloning zed-netcoredbg locally and importing it as a dev extension lol

@cm4ker

Copy link
Copy Markdown

https://github.com/MattParkerDev/sharpdbg/ - I found this. Perhaps it's worth looking here as well.

@kevin-mueller

Copy link
Copy Markdown

This is super cool! The runnables.scm thing is very fancy, had no idea Zed supports that.

For those interested, I have forked my own version of this repository, integrating some of the things proposed by this PR. I also added a bunch of other stuff:

https://github.com/kevin-mueller/zed-csharp

@Tiggilyboo I also beat my head against a wall, trying to figure out how to automatically attach the debugger to a test process. In the end, I got it working, but it's a bit hacky.

I basically deferred the building of a csproj to the run_dap_locator function, because that's the only place where the $ZED variables are actually resolved. Then I could just launch the .dll via the netcoredbg config.

@Tiggilyboo

Copy link
Copy Markdown
Author

Not entirely sure what the next steps are here - I can resolve this current conflict, but the current state is still a bit clunky without the upstream Zed API giving us more filesystem operations (we can't find the csproj without a solution like @kevin-mueller has implemented - executes a script in bash or pwsh).

As for the netcoredbg sourcing, if we leave it up to the user to install? I'm not super keen on not providing all targets from unofficial sources.
This would return an error in the zed log stating that the netcoredbg binary could not be found.

@GustavEikaas

Copy link
Copy Markdown

@Tiggilyboo for the netcoredbg sourcing; the new version being released soon will have the macos arm target included Samsung/netcoredbg#174 (comment)

As others have mentioned SharpDbg is another alternative for an OSS coreclr debugger, it is being published as a dotnet tool for easy install, would be similiar install method to roslyn-language-server.

Not many releases yet but author literally just added support for it
https://www.nuget.org/packages/SharpDbg.Cli

Comment threadsrc/csharp.rs
}
}

fn dap_locator_create_scenario(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Total Zed and Rust noob here, but reading through this PR it looks like this currently handles the VSTest path only?

Just wanted to provide some context in case it's useful for future work — not criticism of the approach here, this PR is awesome.

There are currently two test platforms in .NET:

  • VSTest
  • MTP (Microsoft Testing Platform)

If support for MTP is ever added, I think there are a couple of additional pieces that would be needed:

  1. Detect whether the project is using MTP or VSTest. One way to do that is:
dotnet msbuild -getProperty:IsTestingPlatformApplication

If stdout is true then it's an MTP project.

  1. For MTP, it should be possible to build the project, resolve the test assembly path via TargetPath, and issue a DAP launch request against the test executable/assembly rather than using the VSTest attach flow.

For example:

dotnet msbuild -getProperty:TargetPath

which returns the path to the built test assembly (assuming the active configuration, typically Debug).

  1. Test filtering would need different handling since the filter syntax differs from VSTest.

One interesting thing about MTP is that it also supports a server/RPC mode, which could potentially allow test execution and result collection without relying on output parsing:

https://github.com/GustavEikaas/easy-dotnet-server/blob/main/EasyDotnet.IDE/TestRunner/Adapters/MTP/RPC/MtpClient.cs#L59

Not suggesting any of this belongs in this PR, but I thought it might be useful context for anyone looking at test debugging support longer-term.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@Tiggilyboo@Sathiyaraman-M@brendanmckenzie@Dakota-LM@cm4ker@kevin-mueller@GustavEikaas@reflectronic