Where to deploy
Where to deploy
The exact folder the host scans, the SDK's opt-in MSBuild auto-deploy target, the manual copy alternative, and the one rule that trips up almost everyone: ship the plugin DLL and nothing else.
Where the host looks
The runtime only ever looks in one place: a folder named Plugins sitting
next to the running executable. There is no registry entry, no search path, and no
setting that points elsewhere — the scan path is computed from the host's own base directory.
runtime scan path (host internal — shown for orientation)<app base directory>\Plugins\
// computed as: Path.Combine(AppContext.BaseDirectory, "Plugins")
Where that resolves depends on how you run the host. For an installed copy it is under the install
directory; for a local developer build it is inside the build output next to
TradeStrike.Desktop.exe. The two cases you will actually hit:
| Scenario | Drop your DLL here |
|---|---|
| Installed app |
<install dir>\Plugins\ (e.g. C:\Program Files\TradeStrike\Plugins\) |
| Running from a dev build | TradeStrike.Desktop\bin\<Config>\net10.0-windows\Plugins\ |
Plugins folder is not an
error — the scan simply finds nothing. The auto-deploy target creates the folder if it doesn't
exist; for a manual copy, create it yourself.
Auto-deploy from MSBuild (opt-in)
Installing the TradeStrike.Sdk package brings in an MSBuild .targets file
automatically. It defines a single opt-in target, DeployToAlgoStudioPlugins, that copies
your just-built DLL (and its .pdb when present) into a Plugins folder after every build. It
is inert until you opt in — authors who prefer to deploy by hand pay nothing for
importing the file.
Turn it on by setting the property in your plugin .csproj:
XML — YourPlugin.csproj<PropertyGroup>
<DeployToAlgoStudioPlugins>true</DeployToAlgoStudioPlugins>
</PropertyGroup>
The destination defaults to %AppData%\AlgoStudioPro\Plugins. Override it per project with
the AlgoStudioProPluginsFolder property — point it at the Plugins folder
next to the host EXE you actually run:
XML — YourPlugin.csproj<PropertyGroup>
<DeployToAlgoStudioPlugins>true</DeployToAlgoStudioPlugins>
<AlgoStudioProPluginsFolder>C:\Program Files\TradeStrike\Plugins</AlgoStudioProPluginsFolder>
</PropertyGroup>
%AppData%\AlgoStudioPro\Plugins, is not the same as the
<app base directory>\Plugins folder the host actually scans (see above). A plugin
built with the default lands somewhere the host never reads, so it builds cleanly yet never appears. If
your plugin compiles but is missing in the app, set AlgoStudioProPluginsFolder explicitly
to the folder next to TradeStrike.Desktop.exe.
AlgoStudioPro spelling. The MSBuild identifiers
(DeployToAlgoStudioPlugins, AlgoStudioProPluginsFolder) and the default path
still carry the product's pre-rebrand name. The product is TradeStrike; these are simply
the literal identifiers the shipped TradeStrike.Sdk.targets defines today, so you must type them
exactly as written.
Manual copy
If you would rather not couple your build to a host path, leave DeployToAlgoStudioPlugins
off (its default) and copy the DLL yourself after each build:
bash / PowerShellcopy bin\Release\net10.0\YourPlugin.dll "C:\Program Files\TradeStrike\Plugins\"
Then restart TradeStrike. This is exactly what the auto-deploy target does under the hood — it copies the single primary output assembly (and PDB), nothing more.
The golden rule: deploy the plugin DLL only
Once you have the right folder, the other half of deployment is knowing what not to put in it.
Copy only your plugin's own DLL (and optionally its .pdb, so exceptions
carry readable stack traces in the host log). Everything else in your build output is either already
provided by the host or actively harmful to copy.
| File | Ship it? |
|---|---|
YourPlugin.dll |
Yes — this is the plugin. |
YourPlugin.pdb |
Optional — helpful for readable stack traces. |
| A genuine third-party dependency (not host-provided) | Yes — see Dependencies & isolation. |
TradeStrike.Pipeline.Contracts.dll & other SDK contract assemblies |
No — the host already provides these. |
YourPlugin.deps.json / YourPlugin.runtimeconfig.json
|
No. |
The whole bin output folder |
No. |
AssemblyLoadContext. The contract assembly that defines IIndicator is
force-resolved from the host's context so that typeof(IIndicator) is the
same type on both sides. If you ship your own copy of a contract assembly, your
MyIndicator : IndicatorBase implements a different IIndicator than
the host knows, the assignability check fails, and your plugin is silently skipped. The fix is always
the same: deploy just your DLL. The full mechanics are in the next chapter.
This is precisely what the SDK's auto-deploy target does — it copies $(TargetPath)
(your single primary output) and never the dependency tree.