I have had some success using SharpProj (nuget) and transforming everything through the static GDA94_LL as recommended by Australia's ISCM. I have found this step removes the ~200m inaccuracies I was getting on some transforms due to the switch from AGD84 in 2000.
demo code based on unit tests in SharpProj:
Need the SharpProj.Core and SharpProj.Database nuget packages. Optionally can use the SharpProj.NetTopologySuite package to let the code use geometries from NTS.
var from = new List<double> { 386223.411339871935, 7381679.087447824888 });
var AGD84_MGAZ53 = 20353;
var GDA94_LL = 4283;
var GDA20_MGAZ53 = 7853;
using ProjContext pc = new ProjContext();
pc.EnableNetworkConnections = true;
// 'normalised axis' makes sure x = long and y = lat for consistency
using CoordinateReferenceSystem crsFrom = CoordinateReferenceSystem.CreateFromEpsg(AGD84_MGAZ53, pc).WithNormalizedAxis(pc);
using CoordinateReferenceSystem crsTo = CoordinateReferenceSystem.CreateFromEpsg(GDA20_MGAZ53, pc).WithNormalizedAxis(pc);
using CoordinateReferenceSystem crsVia = CoordinateReferenceSystem.CreateFromEpsg(GDA94_LL, pc).WithNormalizedAxis(pc);
using var ct1 = CoordinateTransform.Create(crsFrom, crsVia, pc);
using var ct2 = CoordinateTransform.Create(crsVia, crsTo, pc);
var intermediate = ct1.Apply(new PPoint(from[0], from[1]));
var result = ct2.Apply(intermediate);
With the EnableNetworkConnections
option set to true, the system will fetch grid files from a CDN. I have yet to discover how to get my c# code to load the distortion files or how to get them to work in Azure.
If you get a FileNotFoundException, read the issues on github