> **FIX7 connection diagnostic:** `imsapiGetLibraryVersion(ref string)` now also reports the absolute `ihas.properties` path and the raw `itac.artes.clusternodes` value read from that file. See `FIX7_CONNECTION_DIAGNOSTICS.md`.

# IMSApiDotNet 10.0.0-59 – C# / HttpClient port

This project reconstructs the .NET IMSAPI client from the supplied Java reference bundle
`imsapi-client-javalib-java-bundle-10.0.0-59.jar` and the supplied legacy .NET client 10.0.0-3.

## What is included

- **446 generated public container/result classes** from the Java bundle.
- **356 IMSApiService methods** with the exact Java 10.0.0-59 wire method names.
- IHAP `BINARY_HASH` (protocol version 1) and `BINARY_FIELD` (version 17) serialization.
- Java class hashes and field order copied from the running Java reference implementation.
- `HttpClient` transport; no `HttpWebRequest` / `WebRequest` in the new transport.
- Locator support for `itac.artes.clusternodes`, `/artes/lookup`, `/imsapi/service?type=machine`, plus a direct service URL override.
- Request header behavior: `Content-Type`/`Accept` `application/octet-stream`, `reqnr`, optional Authorization and gzip request bodies.
- Legacy namespace `com.itac.mes.imsapi.client.dotnet` with the old synchronous return-code/ref-parameter API for the methods present in the legacy DLL.
- Message subscription compatibility implemented as a background `msgCallback` loop.
- Golden protocol vectors produced by the supplied Java JAR.
- The original JAR/DLL and extraction metadata under `reference/` for traceability.

## Build

Requires a current .NET SDK (8 or newer is recommended):

```powershell
./scripts/build.ps1
./scripts/test.ps1
```

The library itself targets `netstandard2.0` for broad compatibility. Its **assembly version stays at `10.0.0.3`** to improve drop-in compatibility with applications compiled against the supplied legacy DLL; file/package version is `10.0.0.59`. The golden-vector test project targets `net8.0`.

Output:

`src/IMSApiDotNet/bin/Release/netstandard2.0/IMSApiDotNet.dll`

## Legacy-style usage

```csharp
using com.itac.mes.imsapi.client.dotnet;
using com.itac.mes.imsapi.domain.container;

var api = IMSApiDotNet.loadLibrary();
IMSApiDotNet.setProperty("itac.artes.clusternodes", "http://mes-node-1:8080,http://mes-node-2:8080");
IMSApiDotNet.setProperty("itac.appid", "MyApplication");

int rc = api.imsapiInit();
var validation = new IMSApiSessionValidationStruct();
// populate validation fields ...
IMSApiSessionContextStruct context = null;
rc = api.regLogin(validation, ref context);
```

For a known endpoint you may bypass locator discovery:

```csharp
IMSApiDotNet.setProperty("itac.artes.ihap.serviceurl", "http://mes-host:8080/imsapi/service");
```

## Modern API

```csharp
var options = new com.itac.mes.imsapi.transport.IhapClientOptions();
options.ClusterNodes.Add("http://mes-node-1:8080");
using var client = new com.itac.mes.imsapi.transport.IhapClient(options);
var service = new com.itac.mes.imsapi.domain.IMSApiServiceStub(client);
var result = service.imsapiGetErrorText(context, -900);
```

## Verification status

The protocol layout was reverse-checked against **golden byte vectors generated by the supplied Java 10.0.0-59 JAR**. The test project contains vectors for both BINARY_HASH and BINARY_FIELD.

This ChatGPT execution environment does **not** contain a .NET SDK/compiler, and external package installation is blocked. Therefore the final `dotnet build` could not be executed here. The source tree was generated without NuGet dependencies so it can be built directly on a normal Visual Studio/.NET SDK machine.

## Compatibility notes

The Java 10.0.0-59 service contains six additional business methods not present in the old 10.0.0-3 .NET interface, plus `msgCallback` (which the old .NET wrapper hid behind `msgSubscribe`):

- `batchCompleteBatch`
- `batchSplitBatchNumber`
- `equCheckEquipments`
- `mlGetMaterialChainData`
- `mlSpliceMaterialChain`
- `mlSplitMaterialChain`
- `msgCallback` (transport callback used by the compatibility subscription loop)

They are available through `IMSApiServiceStub`. Existing methods retain the old synchronous wrapper shape where it could be derived from the supplied .NET binary.

The cluster locator in this port performs the Java-style `/artes/lookup` request and tests `/imsapi/service?type=machine`. In complex installations where lookup returns a node-id that maps to a URL not present in `itac.artes.clusternodes`, configure all reachable cluster-node base URLs or set `itac.artes.ihap.serviceurl` directly.

## .NET Framework 4.8 / Multi-target build

This revision multi-targets the library as `netstandard2.0;net48`.

After a Release build, use:

- `src/IMSApiDotNet/bin/Release/net48/IMSApiDotNet.dll` for classic .NET Framework 4.8 applications.
- `src/IMSApiDotNet/bin/Release/netstandard2.0/IMSApiDotNet.dll` for .NET Standard 2.0 consumers.

A private `Microsoft.NETFramework.ReferenceAssemblies.net48` build reference is included for the `net48` target. See `NET48_BUILD.md` for details.

## FIX3 - System.Net.Http / Visual Studio

If Visual Studio reports `CS0234`/`CS0246` for `System.Net.Http` or `HttpClient` in the `netstandard2.0` target, FIX3 contains an explicit conditional `System.Net.Http` 4.3.4 package reference. `CS1591` warnings for the generated API model have also been suppressed.

After opening the solution, run **Restore NuGet Packages** and then **Rebuild Solution**.


## FIX4 / native .NET Framework 4.8 build

If your goal is a .NET Framework 4.8 DLL, open `IMSApiDotNet_NET48_ONLY.sln`. This solution builds only the native `net48` project and therefore cannot be blocked by a failing `netstandard2.0` restore. See `FIX4_README.md`.
