FubarDev.Lexware.Service 0.3.1

Prefix Reserved
dotnet add package FubarDev.Lexware.Service --version 0.3.1
                    
NuGet\Install-Package FubarDev.Lexware.Service -Version 0.3.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FubarDev.Lexware.Service" Version="0.3.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FubarDev.Lexware.Service" Version="0.3.1" />
                    
Directory.Packages.props
<PackageReference Include="FubarDev.Lexware.Service" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FubarDev.Lexware.Service --version 0.3.1
                    
#r "nuget: FubarDev.Lexware.Service, 0.3.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FubarDev.Lexware.Service@0.3.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FubarDev.Lexware.Service&version=0.3.1
                    
Install as a Cake Addin
#tool nuget:?package=FubarDev.Lexware.Service&version=0.3.1
                    
Install as a Cake Tool

FubarDev.Lexware

.NET-Bibliotheken für den Zugriff auf Daten der Lexware-Desktopanwendung.

Übersicht

Lexware Financial Office speichert seine Daten je nach Version in einer SAP SQL Anywhere- (bis Lexware 2025) oder PostgreSQL-Datenbank (ab Lexware 2026). Eine direkte Schnittstelle für maschinell lesbare Datenexporte existiert nicht. Dieses Projekt stellt ein .NET-10-Bibliothekspaket bereit, das den vollständigen Zugriff auf diese Daten ermöglicht — von der Verbindungsaufbau-Initialisierung bis hin zu NHibernate-Sessions auf die Entitymodelle.

Bibliotheken

Paket Inhalt
FubarDev.Lexware.Database.Abstractions Schnittstellen für Session-Factory und Credential-Generator; NHibernate-Hilfsmittel (DateOnlyType, ILexwareSessionFactoryConfigurator)
FubarDev.Lexware.Database.SqlAnywhere NHibernate-Session-Factory für SAP SQL Anywhere 17
FubarDev.Lexware.Database.Postgres NHibernate-Session-Factory für PostgreSQL
FubarDev.Lexware.Entities.LxOffice NHibernate-Entities für die lxoffice-Datenbank (Benutzer, Firmen)
FubarDev.Lexware.Entities.LxCompany NHibernate-Entities für die Firmendatenbanken (f1, f2, …)
FubarDev.Lexware.Configuration.Abstractions Schnittstellen für Konfigurationspersistierung (ILexwareConfigurationStore, ILexwareConfigurationProvider, ILexwareConfigurationSource)
FubarDev.Lexware.Configuration.Json JSON-Datei-basierte Konfiguration mit transparenter Verschlüsselung sensitiver Werte
FubarDev.Lexware.PropertyStore Leser für den Lexware PropertyStore (Verbindungsparameter, DSN-Erkennung)
FubarDev.Lexware.Service Refit-HTTP-Client für den lokalen LexwareService (PostgreSQL)
FubarDev.Lexware.Client High-Level-Client: Initialisierung, Login, Session-Management

FubarDev.Lexware.Client zieht die meisten Pakete als transitive Abhängigkeiten mit. FubarDev.Lexware.Configuration.Json muss separat referenziert werden.

Beispielanwendung

Das Repository enthält samples/lx-access — ein CLI-Tool das zeigt, wie die Bibliotheken zusammenspielen.

Das Tool ist aufgrund seiner Größe nicht im NuGet-Registry verfügbar. Es kann direkt aus den Release-Assets installiert werden:

dotnet tool install --add-source <pfad-zum-release-verzeichnis> lx-access

Voraussetzungen

  • Lexware Financial Office lokal oder über Netzwerkfreigabe erreichbar

  • .NET 10 SDK

  • Für SQL Anywhere: Sap.Data.SQLAnywhere.Core.v2.1.dll aus der lokalen SA17-Installation (SAP-Lizenz, nicht im Repository enthalten — siehe CONTRIBUTING.md). Der Pfad zum Verzeichnis, das die DLL enthält, wird über den Konfigurationsschlüssel Lexware:Database:SqlAnywhere:AdoNetAssemblyDirectory gesetzt — z.B. per appsettings.json:

    {
      "Lexware": {
        "Database": {
          "SqlAnywhere": {
            "AdoNetAssemblyDirectory": "C:\\Program Files\\SQL Anywhere 17\\Assembly\\Core2.1"
          }
        }
      }
    }
    

    Die DLL befindet sich typischerweise im Unterverzeichnis Assembly\Core2.1 der SQL-Anywhere-17-Installation. Alternativ kann der Pfad per Umgebungsvariable gesetzt werden:

    DOTNET_Lexware__Database__SqlAnywhere__AdoNetAssemblyDirectory="C:\Program Files\SQL Anywhere 17\Assembly\Core2.1"
    

    Wird kein Pfad angegeben, greift .NET auf die Standard-Suchpfade zurück.

Installation

dotnet add package FubarDev.Lexware.Client
dotnet add package FubarDev.Lexware.Configuration.Json

FubarDev.Lexware.Client zieht FubarDev.Lexware.Configuration.Abstractions als transitive Abhängigkeit mit. Das JSON-Konfigurationspaket wird separat referenziert und stellt den JsonFileLexwareConfigurationStoreProvider bereit.

Schnellstart

Die folgenden Beispiele sind als eigenständige C#-Skripte konzipiert und können direkt mit dotnet run <datei>.cs ausgeführt werden (.NET 10 SDK).

Initialisierung (einmalig)

Die Initialisierung liest den PropertyStore der Lexware-Freigabe, ermittelt das Datenbankbackend, holt Zertifikate (PostgreSQL) und testet die Verbindung. Das Ergebnis wird über ILexwareConfigurationStore persistiert. Sensitive Werte werden transparent verschlüsselt — IConfiguration liefert immer Klartext.

#:package FubarDev.Lexware.Client
#:package FubarDev.Lexware.Configuration.Json

using FubarDev.Lexware.Client;
using FubarDev.Lexware.Configuration;
using FubarDev.Lexware.Configuration.Json;
using FubarDev.Lexware.PropertyStore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var cacheFile = Path.Combine(Path.GetTempPath(), "lexware-properties.json");
var configFile = Path.Combine(Path.GetTempPath(), "lexware-configuration.json");

var builder = Host.CreateApplicationBuilder(args);
builder.Configuration
    .AddJsonLexwareConfiguration(configFile)
    .AddJsonLexwarePropertyStore(cacheFile);
builder.Services.AddLexwareClient();

var host = builder.Build();
await host.StartAsync();

var manager = host.Services.GetRequiredService<IPropertyStoreManager>();
manager.Update();

var client = host.Services.GetRequiredService<ILexwareClient>();
var store = host.Services.GetRequiredService<ILexwareConfigurationStore>();

await client.InitializeAsync(
    sharePath: @"\\server\lexware",
    configurationStore: store,
    progress: new Progress<string>(Console.WriteLine),
    cancellationToken: CancellationToken.None);

await host.StopAsync();

Login und Datenbankzugriff

#:package FubarDev.Lexware.Client
#:package FubarDev.Lexware.Configuration.Json

using FubarDev.Lexware.Client;
using FubarDev.Lexware.Client.Session;
using FubarDev.Lexware.Configuration.Json;
using FubarDev.Lexware.Entities.LxOffice;
using FubarDev.Lexware.Entities.LxCompany;
using FubarDev.Lexware.PropertyStore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NHibernate.Linq;

var cacheFile = Path.Combine(Path.GetTempPath(), "lexware-properties.json");
var configFile = Path.Combine(Path.GetTempPath(), "lexware-configuration.json");

var builder = Host.CreateApplicationBuilder(args);
builder.Configuration
    .AddJsonLexwareConfiguration(configFile)
    .AddJsonLexwarePropertyStore(cacheFile);
builder.Services.AddLexwareClient();

var host = builder.Build();
await host.StartAsync();

// PropertyStore von der Lexware-Freigabe laden (aktualisiert IConfiguration)
host.Services.GetRequiredService<IPropertyStoreManager>().Update();

var client = host.Services.GetRequiredService<ILexwareClient>();
var result = await client.LoginAsync("Supervisor", ".", CancellationToken.None);

if (result is SessionResult.Success { Session: ILexwareUserSession session })
{
    // Zugriff auf lxoffice (Benutzer, Firmen)
    using var officeFactory = session.CreateOfficeSessionFactory();
    using var officeSession = officeFactory.OpenSession();
    var users = await officeSession.Query<LxGlobalUser>().ToListAsync();
    Console.WriteLine($"{users.Count} Benutzer gefunden.");

    // Zugriff auf eine Firmendatenbank
    using var companyFactory = await session.CreateCompanySessionFactoryAsync(
        companyId: 1,
        CancellationToken.None);
    using var companySession = companyFactory.OpenSession();
    var orders = await companySession.Query<FkAuftrag>().ToListAsync();
    Console.WriteLine($"{orders.Count} Aufträge in Firma 1.");
}

await host.StopAsync();

Mappings erweitern oder ersetzen

Eigene NHibernate-Entities können per DI-Registrierung eines ILexwareSessionFactoryConfigurator eingebunden werden:

#:package FubarDev.Lexware.Client
#:package FubarDev.Lexware.Configuration.Json

using FubarDev.Lexware.Client;
using FubarDev.Lexware.Configuration.Json;
using FubarDev.Lexware.Database;
using FubarDev.Lexware.PropertyStore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NHibernate.Cfg;

var cacheFile = Path.Combine(Path.GetTempPath(), "lexware-properties.json");
var configFile = Path.Combine(Path.GetTempPath(), "lexware-configuration.json");

var builder = Host.CreateApplicationBuilder(args);
builder.Configuration
    .AddJsonLexwareConfiguration(configFile)
    .AddJsonLexwarePropertyStore(cacheFile);
builder.Services.AddLexwareClient();

// Eigene Entities zusätzlich laden:
builder.Services.AddSingleton<ILexwareSessionFactoryConfigurator, MyConfigurator>();

var host = builder.Build();

class MyConfigurator : ILexwareSessionFactoryConfigurator
{
    public void ConfigureCompanySessionFactory(Configuration cfg)
        => cfg.AddAssembly(typeof(MyCompanyEntity).Assembly);
}

Wird kein Konfigurator registriert oder werden keine Mappings gesetzt, greift der eingebaute Fallback auf die Standard-Entity-Assemblies.

Konfiguration

Die Bibliotheken lesen ihre Einstellungen aus IConfiguration. Die meisten Werte werden automatisch aus dem PropertyStore befüllt.

Schlüssel Beschreibung
Lexware:Client:SharePath Pfad zur Lexware-Freigabe (z.B. \\server\lexware)
Lexware:Database:DatabaseType SqlAnywhere oder Postgres (aus PropertyStore)
Lexware:Database:SqlAnywhere:DbPath Verzeichnis der SA-Datenbankdateien
Lexware:Database:SqlAnywhere:AdoNetAssemblyDirectory Verzeichnis der Sap.Data.SQLAnywhere.Core.v2.1.dll
Lexware:Database:Postgres:Addresses:0 PostgreSQL-Hostadresse (aus PropertyStore)
Lexware:Database:Postgres:Port PostgreSQL-Port (aus PropertyStore)
Lexware:LexwareService:Port Port des lokalen LexwareService (PostgreSQL, aus PropertyStore)
Lexware:Product:Version Lexware-Versionsnummer (aus PropertyStore)

Zweck und beabsichtigte Nutzung

Diese Bibliothek wurde ausschließlich entwickelt, um Drittanwendungen die Interoperabilität mit lokal installierten, lizenzierten Lexware Financial Office-Installationen zu ermöglichen.

Lexware Financial Office stellt keinen vollständig maschinell lesbaren Datenexport für alle Datenkategorien bereit. Wo nur menschenlesbare Berichte verfügbar sind, ist der programmatische Zugriff auf die zugrundeliegende Datenbank der einzig gangbare Weg. Diese Bibliothek erlaubt es Drittanwendungen, sich mit denselben Zugangsdaten zu authentifizieren, die bereits in Lexware hinterlegt sind.

Die Bibliothek ist ausschließlich für lizenzierte Lexware-Nutzer gedacht, die auf ihre eigenen Daten aus ihrer eigenen lizenzierten Installation zugreifen möchten.

Rechtlicher Hinweis

Interoperabilität

Die in dieser Bibliothek implementierten Verfahren wurden durch Reverse Engineering zum alleinigen Zweck der Herstellung von Interoperabilität mit Lexware Financial Office gewonnen, wie es ausdrücklich durch § 69e UrhG (Urheberrechtsgesetz) und § 3 GeschGehG (Geschäftsgeheimnisgesetz) erlaubt ist.

Vertragliche Klauseln, die Reverse Engineering zu Interoperabilitätszwecken untersagen, sind nach § 69g Abs. 2 UrhG kraft Gesetzes unwirksam.

Nutzungsumfang

Diese Bibliothek wird ausschließlich zu Interoperabilitätszwecken bereitgestellt. Sie ist ausschließlich zur Nutzung mit lizenzierten Lexware-Installationen durch den jeweiligen Lizenznehmer zum Zugriff auf eigene Daten bestimmt. Jede Nutzung, die diesen Rahmen überschreitet — insbesondere der unberechtigte Zugriff auf fremde Systeme — ist kein unterstützter oder beabsichtigter Anwendungsfall und liegt in der alleinigen Verantwortung des Nutzers.

Keine Weitergabe von Lexware-Komponenten

Diese Bibliothek enthält, bündelt oder verteilt keine Komponente, Binary oder sonstige Asset von Lexware oder der Haufe Group.

Haftungsausschluss

DIE SOFTWARE WIRD OHNE MÄNGELGEWÄHR UND OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG BEREITGESTELLT. DIE AUTOREN HAFTEN IN KEINEM FALL FÜR ANSPRÜCHE, SCHÄDEN ODER SONSTIGE VERBINDLICHKEITEN, DIE AUS DER NUTZUNG DER SOFTWARE ENTSTEHEN.

Lizenz

Copyright (c) 2026 Fubar Development Junker

Dieses Projekt steht unter der MIT-Lizenz.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on FubarDev.Lexware.Service:

Package Downloads
FubarDev.Lexware.Client

High-level client for accessing Lexware desktop application data (SQL Anywhere and PostgreSQL).

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.3.1 0 4/14/2026
0.3.0 29 4/13/2026
0.2.0 30 4/12/2026
0.1.1 35 4/12/2026
0.1.0 98 4/1/2026