Skip to content

Building & Deploying

Build command

dotnet publish -c Release

For explicit control over all options:

dotnet publish -c Release -r win-x64 --self-contained true /p:PublishAot=true

Output files

File Purpose
YourPlugin.dll The native DLL — this is the file HydroSym loads
YourPlugin.pdb Debug symbols — keep for crash analysis, do not ship to end users
YourPlugin.exp, .lib Linker artifacts — not needed at runtime

Only YourPlugin.dll needs to be deployed.

Build machine requirements

NativeAOT requires the Visual C++ build tools (MSVC) to be installed on the build machine. Install "Desktop development with C++" from the Visual Studio Installer, or use the standalone Build Tools package.

Deployment layout

Create a dedicated directory for each plugin:

C:\ProgramData\HydroSym\plugins\
└── AcmeErpPlugin\
    ├── AcmeErpPlugin.dll
    └── acme.ini          ← plugin config file (optional)

Keep each plugin in its own subdirectory to avoid DLL naming conflicts.

Configuring HydroSym

Edit the HydroSym INI file. The default location is:

C:\ProgramData\HydroSym\HydroSym.ini

Add a [Plugin] section:

[Plugin]
Type=DLL
Path=C:\ProgramData\HydroSym\plugins\AcmeErpPlugin\AcmeErpPlugin.dll
ConfigPath=C:\ProgramData\HydroSym\plugins\AcmeErpPlugin\acme.ini
Key Description
Type DLL for in-process plugins, Process for out-of-process plugins
Path Full path to the plugin DLL or executable
ConfigPath Passed to your plugin's Initialize as request.ConfigPath

HydroSym supports one plugin at a time. If you need multiple integrations in a single plugin, implement all capabilities in one DLL.

Plugin config file

Your plugin reads its config from request.ConfigPath in Initialize. Use a simple INI or JSON format. Example acme.ini:

[Database]
Server=sql-erp-prod.acme.local
Database=AcmeERP
IntegratedSecurity=true

[Options]
AutoCheckIn=true
DefaultCurrency=EUR

Read it in Initialize:

public override void Initialize(InitializeRequest request)
{
    var config = new IniFile(request.ConfigPath);
    _connectionString =
        $"Server={config["Database", "Server"]};" +
        $"Database={config["Database", "Database"]};" +
        "Integrated Security=true;";
}

Deployment via scripts or group policy

For multi-machine deployments:

# deploy.ps1
$dest = "C:\ProgramData\HydroSym\plugins\AcmeErpPlugin"
New-Item -ItemType Directory -Force -Path $dest
Copy-Item ".\publish\AcmeErpPlugin.dll" -Destination $dest -Force

# Patch the INI (requires ini-editing module or simple string replacement)

Distribute via: - Group Policy — deploy the script as a Computer Startup Script. - SCCM / Intune — package as an application with the deploy script as the installer. - Shared network share — for small teams, reference the DLL directly from a UNC path in the INI.

Troubleshooting

Plugin menu does not appear

  1. Check %APPDATA%\HydroSym\hydrosym.log for a load error.
  2. Verify the Path in the INI points to the exact file (no typos, correct drive letter).
  3. Run Dependency Walker or dumpbin /exports AcmeErpPlugin.dll and verify HydroSymPlugin_Invoke is exported.

HydroSymPlugin_Invoke not found

The DLL was not compiled with NativeAOT, or the entry point attribute is missing. Ensure your plugin class inherits HydroSymPluginBase and the SDK is correctly referenced.

Access violation on startup

A crash in GetInfo or Initialize. Attach the Visual Studio debugger to HydroSym.exe before it loads the plugin, or check EurekaLog / crash dumps.

GetComponentParameters returns NOT_SUPPORTED

The capability is not listed in GetInfo.Capabilities. Add "getComponentParameters" to the capabilities array.