Open Source · MIT

YaNco

A modern .NET wrapper for the SAP RFC SDK — with a functional API, dependency injection, and cross-platform support.

Why we built YaNco

Our projects kept running into the same wall: .NET services on Linux that need to call SAP, DMS migration tools that trigger SAP HTTP/FTP clients through RFC program callbacks, integration pipelines that chain hundreds of RFC calls. We needed an RFC layer built for modern .NET — one that supports dependency injection, runs cross-platform, and handles errors without exceptions. So we built one.

What it does

Built for real SAP integration projects.

Functional API

Predictable, testable, easy to reason about. RFC operations are pure functions you can compose freely — no hidden state, no side effects, no surprises at runtime.

Side-effect free operations
Safe to parallelize
LINQ syntax for structure and table mapping
Errors as values, not exceptions

Dependency injection

YaNco is designed around DI from the ground up. Connections, contexts, and lifecycles are managed by your container — not by static factories or global state.

Constructor injection of RFC contexts
Connection lifecycle managed by the container
Fluent configuration via IServiceCollection
Testable through interface abstraction

RFC server & callbacks

Let SAP call into your .NET code. Handle inbound RFC calls, process IDocs, or respond to ABAP program start callbacks.

Builder API for server setup
Typed input and output per handler
Transactional RFC for IDoc processing
ABAP callback support

Cross-platform

Runs on Windows, Linux, and macOS. Supports .NET 6+ and .NET Framework 4.7.1+.

.NET 6+
.NET Framework 4.7.1+
Windows, Linux, macOS
SAP NW RFC SDK 750
await context.CallFunction("BAPI_COMPANYCODE_GETDETAIL",
    Input: f => f.SetField("COMPANYCODEID", "1000"),
    Output: f => f
        .MapStructure("COMPANYCODE_DETAIL", s =>
            from name in s.GetField<string>("COMP_NAME")
            from city in s.GetField<string>("CITY")
            select new { Name = name, City = city }))
.Match(
    r => Console.WriteLine($"{r.Name} in {r.City}"),
    l => Console.WriteLine($"Error: {l.Message}"));

Enterprise support

Using YaNco in production? We offer support plans so your team has direct access to the people who build it.

  • Priority bug fixes and hotfixes
  • Direct escalation path for issues
  • Influence on the roadmap
  • Personal support via email, phone, or video
  • Training and coaching for your team

Interested in support?

Tell us about your project and we'll get back to you.

We care about your privacy. Read our privacy policy.

Try YaNco

MIT licensed, open source, ready to use.