odk/CustomTarget_build-examples_java.mk                                        
           |    2 
 odk/Package_examples.mk                                                        
           |   21 
 
odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/FirstLoadComponent.cs
   |   99 +++
 odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/Makefile     
           |   75 ++
 
odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/HelloTextTableShape.cs
 |  300 ++++++++++
 odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/Makefile    
           |   75 ++
 odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/Makefile            
           |   75 ++
 odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/PathSettingsTest.cs 
           |   95 +++
 odk/examples/DevelopersGuide/OfficeDev/PathSettings/java/Makefile              
           |    2 
 odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/Makefile        
           |   75 ++
 
odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/PathSubstitutionTest.cs
    |   77 ++
 odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/Makefile         
           |   75 ++
 
odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminateListener.cs
        |   40 +
 
odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminationTest.cs
          |   57 +
 odk/examples/dotnet/WriterDemo/csharp/Makefile                                 
           |   75 ++
 odk/examples/dotnet/WriterDemo/csharp/WriterDemo.cs                            
           |  144 ++++
 odk/examples/dotnet/WriterDemo/fsharp/Makefile                                 
           |   75 ++
 odk/examples/dotnet/WriterDemo/fsharp/WriterDemo.fs                            
           |  139 ++++
 odk/examples/dotnet/WriterDemo/vbasic/Makefile                                 
           |   75 ++
 odk/examples/dotnet/WriterDemo/vbasic/WriterDemo.vb                            
           |  145 ++++
 20 files changed, 1717 insertions(+), 4 deletions(-)

New commits:
commit b4289da0b4074a219aec899814378c71952e934a
Author:     RMZeroFour <ritobrot...@gmail.com>
AuthorDate: Fri Sep 6 18:47:34 2024 +0530
Commit:     Hossein <hoss...@libreoffice.org>
CommitDate: Wed Sep 18 08:11:26 2024 +0200

    .NET Bindings: Ported examples for Native bridge
    
    This patch include the following SDK examples ported to .NET
    to test the new Native bridge:
    - FirstLoadComponent
    - HelloTextTableShape
    - PathSettings
    - PathSubstitution
    - TerminationTest
    - WriterDemo
    
    The examples include VB.NET and F# as well to test support for
    non-C# .NET languages.
    
    Change-Id: I044df4777c7c091241d5b4284f4b6ee6c5de74f7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172778
    Tested-by: Jenkins
    Reviewed-by: Hossein <hoss...@libreoffice.org>

diff --git a/odk/CustomTarget_build-examples_java.mk 
b/odk/CustomTarget_build-examples_java.mk
index cec90d4066ad..b9e942e5a6d4 100644
--- a/odk/CustomTarget_build-examples_java.mk
+++ b/odk/CustomTarget_build-examples_java.mk
@@ -33,7 +33,7 @@ my_example_dirs_java = \
     DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection \
     DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilter_java \
     DevelopersGuide/OfficeDev/Linguistic \
-    DevelopersGuide/OfficeDev/PathSettings \
+    DevelopersGuide/OfficeDev/PathSettings/java \
     DevelopersGuide/OfficeDev/PathSubstitution/java \
     DevelopersGuide/OfficeDev/TerminationTest/java \
     DevelopersGuide/ProfUNO/InterprocessConn \
diff --git a/odk/Package_examples.mk b/odk/Package_examples.mk
index b2f2ba90244c..82fc78c93c2e 100644
--- a/odk/Package_examples.mk
+++ b/odk/Package_examples.mk
@@ -189,6 +189,8 @@ $(eval $(call 
gb_Package_add_files_with_dir,odk_examples,$(SDKDIRNAME)/examples,
     DevelopersGuide/FirstSteps/FirstUnoContact/python/FirstUnoContact.py \
     DevelopersGuide/FirstSteps/FirstLoadComponent/cxx/FirstLoadComponent.cxx \
     DevelopersGuide/FirstSteps/FirstLoadComponent/cxx/Makefile \
+    DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/FirstLoadComponent.cs 
\
+    DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/Makefile \
     DevelopersGuide/FirstSteps/FirstLoadComponent/java/FirstLoadComponent.java 
\
     DevelopersGuide/FirstSteps/FirstLoadComponent/java/Makefile \
     DevelopersGuide/FirstSteps/FirstLoadComponent/basic/FirstLoadComponent.bas 
\
@@ -196,6 +198,8 @@ $(eval $(call 
gb_Package_add_files_with_dir,odk_examples,$(SDKDIRNAME)/examples,
     
DevelopersGuide/FirstSteps/FirstLoadComponent/python/DualComponentLoader.py \
     DevelopersGuide/FirstSteps/HelloTextTableShape/cxx/HelloTextTableShape.cxx 
\
     DevelopersGuide/FirstSteps/HelloTextTableShape/cxx/Makefile \
+    
DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/HelloTextTableShape.cs \
+    DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/Makefile \
     
DevelopersGuide/FirstSteps/HelloTextTableShape/java/HelloTextTableShape.java \
     DevelopersGuide/FirstSteps/HelloTextTableShape/java/Makefile \
     
DevelopersGuide/FirstSteps/HelloTextTableShape/basic/HelloTextTableShape.bas \
@@ -324,13 +328,20 @@ $(eval $(call 
gb_Package_add_files_with_dir,odk_examples,$(SDKDIRNAME)/examples,
     DevelopersGuide/OfficeDev/MenuElement.java \
     DevelopersGuide/OfficeDev/Number_Formats.java \
     DevelopersGuide/OfficeDev/OfficeConnect.java \
-    DevelopersGuide/OfficeDev/PathSettings/Makefile \
-    DevelopersGuide/OfficeDev/PathSettings/PathSettingsTest.java \
+    DevelopersGuide/OfficeDev/PathSettings/csharp/Makefile \
+    DevelopersGuide/OfficeDev/PathSettings/csharp/PathSettingsTest.cs \
+    DevelopersGuide/OfficeDev/PathSettings/java/Makefile \
+    DevelopersGuide/OfficeDev/PathSettings/java/PathSettingsTest.java \
+    DevelopersGuide/OfficeDev/PathSubstitution/csharp/Makefile \
+    DevelopersGuide/OfficeDev/PathSubstitution/csharp/PathSubstitutionTest.cs \
     DevelopersGuide/OfficeDev/PathSubstitution/java/Makefile \
     DevelopersGuide/OfficeDev/PathSubstitution/java/PathSubstitutionTest.java \
     
DevelopersGuide/OfficeDev/PathSubstitution/python/path_substitution_test.py \
     DevelopersGuide/OfficeDev/TerminationTest/cxx/Makefile \
     DevelopersGuide/OfficeDev/TerminationTest/cxx/TerminationTest.cxx \
+    DevelopersGuide/OfficeDev/TerminationTest/csharp/Makefile \
+    DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminateListener.cs \
+    DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminationTest.cs \
     DevelopersGuide/OfficeDev/TerminationTest/java/Makefile \
     DevelopersGuide/OfficeDev/TerminationTest/java/TerminateListener.java \
     DevelopersGuide/OfficeDev/TerminationTest/java/TerminationTest.java \
@@ -466,6 +477,12 @@ $(eval $(call 
gb_Package_add_files_with_dir,odk_examples,$(SDKDIRNAME)/examples,
     cpp/counter/countermain.cxx \
     cpp/remoteclient/Makefile \
     cpp/remoteclient/remoteclient.cxx \
+    dotnet/WriterDemo/csharp/Makefile \
+    dotnet/WriterDemo/csharp/WriterDemo.cs \
+    dotnet/WriterDemo/fsharp/Makefile \
+    dotnet/WriterDemo/fsharp/WriterDemo.fs \
+    dotnet/WriterDemo/vbasic/Makefile \
+    dotnet/WriterDemo/vbasic/WriterDemo.vb \
     java/DocumentHandling/DocumentConverter.java \
     java/DocumentHandling/DocumentLoader.java \
     java/DocumentHandling/DocumentPrinter.java \
diff --git 
a/odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/FirstLoadComponent.cs
 
b/odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/FirstLoadComponent.cs
new file mode 100644
index 000000000000..9205d030a642
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/FirstLoadComponent.cs
@@ -0,0 +1,99 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.beans;
+using com.sun.star.container;
+using com.sun.star.frame;
+using com.sun.star.lang;
+using com.sun.star.sheet;
+using com.sun.star.table;
+using com.sun.star.uno;
+
+try
+{
+    XComponentContext xContext = NativeBootstrap.bootstrap();
+    if (xContext is null)
+        Console.Error.WriteLine("Could not bootstrap office");
+
+    XMultiComponentFactory xServiceManager = xContext.getServiceManager();
+
+    IQueryInterface desktop = xServiceManager
+        .createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
+    XComponentLoader xComponentLoader = desktop.query<XComponentLoader>();
+
+    PropertyValue[] loadProps = Array.Empty<PropertyValue>();
+    XComponent xSpreadsheetComponent = xComponentLoader
+        .loadComponentFromURL("private:factory/scalc", "_blank", 0, loadProps);
+
+    XSpreadsheetDocument xSpreadsheetDocument = xSpreadsheetComponent
+        .query<XSpreadsheetDocument>();
+
+    XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
+    xSpreadsheets.insertNewByName("MySheet", 0);
+    Type elemType = xSpreadsheets.getElementType();
+    Console.WriteLine(elemType.FullName);
+
+    Any sheet = xSpreadsheets.getByName("MySheet");
+    XSpreadsheet xSpreadsheet = sheet.castOrDefault<XSpreadsheet>();
+
+    XCell xCell = xSpreadsheet.getCellByPosition(0, 0);
+    xCell.setValue(21);
+    xCell = xSpreadsheet.getCellByPosition(0, 1);
+    xCell.setValue(21);
+    xCell = xSpreadsheet.getCellByPosition(0, 2);
+    xCell.setFormula("=sum(A1:A2)");
+
+    XPropertySet xCellProps = xCell.query<XPropertySet>();
+    xCellProps.setPropertyValue("CellStyle", new Any("Result"));
+
+    XModel xSpreadsheetModel = xSpreadsheetComponent.query<XModel>();
+    XController xSpreadsheetController = 
xSpreadsheetModel.getCurrentController();
+    XSpreadsheetView xSpreadsheetView = 
xSpreadsheetController.query<XSpreadsheetView>();
+    xSpreadsheetView.setActiveSheet(xSpreadsheet);
+
+    // Example usage of enum values
+    xCellProps.setPropertyValue("VertJustify", new Any(CellVertJustify.TOP));
+
+    // Example usage of PropertyValue structs
+    loadProps = new PropertyValue[1]
+    {
+        new PropertyValue()
+        {
+            Name = "AsTemplate",
+            Value = new Any(true),
+        }
+    };
+
+    // Uncomment to load a Calc file as template
+    //xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(
+    //    "file:///c:/temp/DataAnalysys.ods", "_blank", 0, loadProps);
+
+    // Example usage of XEnumerationAccess
+    XCellRangesQuery xCellQuery = sheet.castOrDefault<XCellRangesQuery>();
+    XSheetCellRanges xFormulaCells = 
xCellQuery.queryContentCells(CellFlags.FORMULA);
+    XEnumerationAccess xFormulas = xFormulaCells.getCells();
+    XEnumeration xFormulaEnum = xFormulas.createEnumeration();
+
+    while (xFormulaEnum.hasMoreElements())
+    {
+        Any formulaCell = xFormulaEnum.nextElement();
+        xCell = formulaCell.castOrDefault<XCell>();
+        XCellAddressable xCellAddress = xCell.query<XCellAddressable>();
+        Console.WriteLine($"Formula cell in column 
{xCellAddress.getCellAddress().Column}, row {xCellAddress.getCellAddress().Row} 
contains {xCell.getFormula()}");
+    }
+
+    return 0;
+}
+catch (UnoException e)
+{
+    Console.Error.WriteLine(e.Message);
+
+    return 1;
+}
\ No newline at end of file
diff --git 
a/odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/Makefile 
b/odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/Makefile
new file mode 100644
index 000000000000..2cd58d246ac7
--- /dev/null
+++ b/odk/examples/DevelopersGuide/FirstSteps/FirstLoadComponent/csharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the FirstLoadComponent example of the Developers Guide.
+
+PRJ = ../../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = FirstLoadComponent
+APP_LANG = cs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git 
a/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/HelloTextTableShape.cs
 
b/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/HelloTextTableShape.cs
new file mode 100644
index 000000000000..8d67ccf01427
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/HelloTextTableShape.cs
@@ -0,0 +1,300 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.awt;
+using com.sun.star.beans;
+using com.sun.star.container;
+using com.sun.star.drawing;
+using com.sun.star.frame;
+using com.sun.star.lang;
+using com.sun.star.sheet;
+using com.sun.star.table;
+using com.sun.star.text;
+using com.sun.star.uno;
+
+XComponentContext xRemoteContext = null;
+XMultiComponentFactory xRemoteServiceManager = null;
+
+try
+{
+    UseWriter();
+    UseCalc();
+    UseDraw();
+    return 0;
+}
+catch (UnoException e)
+{
+    Console.Error.WriteLine(e.Message);
+    return 1;
+}
+
+void UseWriter()
+{
+    // Create a new Writer document, and manipulate the text content
+    XComponent xWriterComponent = NewDocComponent("swriter");
+    XTextDocument xTextDocument = xWriterComponent.query<XTextDocument>();
+    XText xText = xTextDocument.getText();
+
+    ManipulateText(xText);
+
+    // Get the internal service factory of the document
+    XMultiServiceFactory xWriterFactory = 
xTextDocument.query<XMultiServiceFactory>();
+
+    // Insert a TextTable, and manipulate the text content of the cell
+    XTextContent xTextContentTable = 
xWriterFactory.createInstance("com.sun.star.text.TextTable").query<XTextContent>();
+    xText.insertTextContent(xText.getEnd(), xTextContentTable, false);
+
+    XCellRange xCellRange = xTextContentTable.query<XCellRange>();
+    XCell xCell = xCellRange.getCellByPosition(0, 1);
+    XText xCellText = xCell.query<XText>();
+
+    ManipulateText(xCellText);
+    ManipulateTable(xCellRange);
+
+    XShape xWriterShape = 
xWriterFactory.createInstance("com.sun.star.drawing.RectangleShape").query<XShape>();
+    xWriterShape.setSize(new Size(10000, 10000));
+    XTextContent xTextContentShape = xWriterShape.query<XTextContent>();
+
+    xText.insertTextContent(xText.getEnd(), xTextContentShape, false);
+
+    // Wrap the text inside the shape
+    XPropertySet xShapeProps = xWriterShape.query<XPropertySet>();
+    xShapeProps.setPropertyValue("TextContourFrame", new Any(true));
+
+    XText xShapeText = xWriterShape.query<XText>();
+
+    ManipulateText(xShapeText);
+    ManipulateShape(xWriterShape);
+
+    // Create and name a bookmark
+    IQueryInterface bookmark = 
xWriterFactory.createInstance("com.sun.star.text.Bookmark");
+    XNamed xNamed = bookmark.query<XNamed>();
+    xNamed.setName("MyUniqueBookmarkName");
+
+    // Insert the bookmark at the end of the document
+    XTextContent xTextContent = bookmark.query<XTextContent>();
+    xText.insertTextContent(xText.getEnd(), xTextContent, false);
+
+    // Get all bookmarks from the XBookmarksSupplier
+    XBookmarksSupplier xBookmarksSupplier = 
xWriterComponent.query<XBookmarksSupplier>();
+    XNameAccess xNamedBookmarks = xBookmarksSupplier.getBookmarks();
+    XTextContent xFoundBookmark = 
xNamedBookmarks.getByName("MyUniqueBookmarkName").cast<XTextContent>();
+    XTextRange xFound = xFoundBookmark.getAnchor();
+    xFound.setString(" The throat mike, glued to her neck, "
+        + "looked as much as possible like an analgesic dermadisk.");
+
+    // Get all tables from the XTextTablesSupplier
+    XTextTablesSupplier xTablesSupplier = 
xWriterComponent.query<XTextTablesSupplier>();
+    XNameAccess xNamedTables = xTablesSupplier.getTextTables();
+    XIndexAccess xIndexedTables = xNamedTables.query<XIndexAccess>();
+
+    // Get the tables
+    XPropertySet xTableProps = null;
+    for (int i = 0; i < xIndexedTables.getCount(); i++)
+    {
+        xTableProps = xIndexedTables.getByIndex(i).cast<XPropertySet>();
+        xTableProps.setPropertyValue("BackColor", new Any(0xC8FFB9));
+    }
+}
+
+void UseCalc()
+{
+    // Create a new Calc document, and manipulate text in a cell
+    XComponent xCalcComponent = NewDocComponent("scalc");
+    XSpreadsheetDocument xCalcDocument = 
xCalcComponent.query<XSpreadsheetDocument>();
+    XSpreadsheetDocument xSpreadsheetDocument = 
xCalcDocument.query<XSpreadsheetDocument>();
+
+    XIndexAccess xIndexedSheets = 
xSpreadsheetDocument.getSheets().query<XIndexAccess>();
+    XCellRange xSpreadsheetCells = 
xIndexedSheets.getByIndex(0).cast<XCellRange>();
+
+    // Get cell A2 from the first sheet
+    XCell xCell = xSpreadsheetCells.getCellByPosition(0, 1);
+    XText xCellText = xCell.query<XText>();
+
+    XPropertySet xCellProps = xCell.query<XPropertySet>();
+    xCellProps.setPropertyValue("IsTextWrapped", new Any(true));
+
+    ManipulateText(xCellText);
+    ManipulateTable(xSpreadsheetCells);
+
+    // Get the internal service factory of the document
+    XMultiServiceFactory xCalcFactory = 
xCalcDocument.query<XMultiServiceFactory>();
+    XDrawPageSupplier xDrawPageSupplier = 
xIndexedSheets.getByIndex(0).cast<XDrawPageSupplier>();
+    XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
+
+    // Create and insert a RectangleShape, and manipulate its shape text
+    XShape xCalcShape = 
xCalcFactory.createInstance("com.sun.star.drawing.RectangleShape").query<XShape>();
+    xCalcShape.setSize(new Size(10000, 10000));
+    xCalcShape.setPosition(new Point(7000, 3000));
+    xDrawPage.add(xCalcShape);
+
+    // Wrap the text inside the shape
+    XPropertySet xShapeProps = xCalcShape.query<XPropertySet>();
+    xShapeProps.setPropertyValue("TextContourFrame", new Any(true));
+
+    XText xShapeText = xCalcShape.query<XText>();
+    ManipulateText(xShapeText);
+    ManipulateShape(xCalcShape);
+}
+
+void UseDraw()
+{
+    // Create a new Draw document, and insert a rectangle
+    XComponent xDrawComponent = NewDocComponent("sdraw");
+    XDrawPagesSupplier xDrawPagesSupplier = 
xDrawComponent.query<XDrawPagesSupplier>();
+
+    XIndexAccess xIndexedDrawPages = xDrawPagesSupplier.getDrawPages();
+    XDrawPage xDrawPage = xIndexedDrawPages.getByIndex(0).cast<XDrawPage>();
+
+    // Get the internal service factory of the document
+    XMultiServiceFactory xDrawFactory = 
xDrawComponent.query<XMultiServiceFactory>();
+    XShape xDrawShape = 
xDrawFactory.createInstance("com.sun.star.drawing.RectangleShape").query<XShape>();
+    xDrawShape.setSize(new Size(10000, 20000));
+    xDrawShape.setPosition(new Point(5000, 5000));
+    xDrawPage.add(xDrawShape);
+
+    // Wrap the text inside the shape
+    XPropertySet xShapeProps = xDrawShape.query<XPropertySet>();
+    xShapeProps.setPropertyValue("TextContourFrame", new Any(true));
+
+    XText xShapeText = xDrawShape.query<XText>();
+    ManipulateText(xShapeText);
+    ManipulateShape(xDrawShape);
+}
+
+void ManipulateText(XText xText)
+{
+    // Set the entire text at once
+    xText.setString("He lay flat on the brown, pine-needled floor of the 
forest, "
+        + "his chin on his folded arms, and high overhead the wind blew in the 
tops "
+        + "of the pine trees.");
+
+    // Create a text cursor for selecting and formatting
+    XTextCursor xTextCursor = xText.createTextCursor();
+    XPropertySet xCursorProps = xTextCursor.query<XPropertySet>();
+
+    // Use the cursor to select "He lay", and apply bold and italic formatting
+    xTextCursor.gotoStart(false);
+    xTextCursor.goRight(6, true);
+
+    xCursorProps.setPropertyValue("CharPosture", new Any(FontSlant.ITALIC));
+    xCursorProps.setPropertyValue("CharWeight", new Any(FontWeight.BOLD));
+
+    xTextCursor.gotoEnd(false);
+    xText.insertString(xTextCursor.getStart(),
+        " The mountainside sloped gently where he lay; "
+        + "but below it was steep and he could see the dark of the oiled road "
+        + "winding through the pass. There was a stream alongside the road "
+        + "and far down the pass he saw a mill beside the stream and the 
falling water "
+        + "of the dam, white in the summer sunlight.", false);
+    xText.insertString(xTextCursor.getStart(), "
  \"Is that the mill?\" he asked.", false);
+}
+
+void ManipulateTable(XCellRange xCellRange)
+{
+    // Set column titles and a cell value
+    XCell xCell = xCellRange.getCellByPosition(0, 0);
+    XText xCellText = xCell.query<XText>();
+    xCellText.setString("Quotation");
+
+    xCell = xCellRange.getCellByPosition(1, 0);
+    xCellText = xCell.query<XText>();
+    xCellText.setString("Year");
+
+    xCell = xCellRange.getCellByPosition(1, 1);
+    xCell.setValue(1940);
+
+    XCellRange xSelectedCells = xCellRange.getCellRangeByName("A1:B1");
+    XPropertySet xCellProps = xSelectedCells.query<XPropertySet>();
+
+    string backColorPropertyName = null;
+    XPropertySet xTableProps = null;
+
+    // Format the table headers and borders
+    XServiceInfo xServiceInfo = xCellRange.query<XServiceInfo>();
+    if (xServiceInfo.supportsService("com.sun.star.sheet.Spreadsheet"))
+    {
+        backColorPropertyName = "CellBackColor";
+        xSelectedCells = xCellRange.getCellRangeByName("A1:B2");
+        xTableProps = xSelectedCells.query<XPropertySet>();
+    }
+    else if (xServiceInfo.supportsService("com.sun.star.text.TextTable"))
+    {
+        backColorPropertyName = "BackColor";
+        xTableProps = xCellRange.query<XPropertySet>();
+    }
+    // Set cell background color
+    xCellProps.setPropertyValue(backColorPropertyName, new Any(0x99CCFF));
+
+    // Set table borders (blue line, width 10)
+    BorderLine theLine = new BorderLine()
+    {
+        Color = 0x000099,
+        OuterLineWidth = 10,
+    };
+    
+    // Use the above defined line for all borders and enable them
+    TableBorder bord = new TableBorder()
+    {
+        VerticalLine = theLine,
+        HorizontalLine = theLine,
+        LeftLine = theLine,
+        RightLine = theLine,
+        TopLine = theLine,
+        BottomLine = theLine,
+
+        IsVerticalLineValid = true,
+        IsHorizontalLineValid = true,
+        IsLeftLineValid = true,
+        IsRightLineValid = true,
+        IsTopLineValid = true,
+        IsBottomLineValid = true,
+    };
+    xTableProps.setPropertyValue("TableBorder", new Any(bord));
+
+    bord = xTableProps.getPropertyValue("TableBorder").cast<TableBorder>();
+    Console.WriteLine(bord.TopLine.Color);
+}
+
+void ManipulateShape(XShape xShape)
+{
+    XPropertySet xShapeProps = xShape.query<XPropertySet>();
+    xShapeProps.setPropertyValue("FillColor", new Any(0x99CCFF));
+    xShapeProps.setPropertyValue("LineColor", new Any(0x000099));
+    xShapeProps.setPropertyValue("RotateAngle", new Any(3000));
+    xShapeProps.setPropertyValue("TextLeftDistance", new Any(0));
+    xShapeProps.setPropertyValue("TextRightDistance", new Any(0));
+    xShapeProps.setPropertyValue("TextUpperDistance", new Any(0));
+    xShapeProps.setPropertyValue("TextLowerDistance", new Any(0));
+}
+
+XComponent NewDocComponent(string docType)
+{
+    XMultiComponentFactory xRemoteServiceManager = GetRemoteServiceManager();
+
+    XComponentLoader xComponentLoader = xRemoteServiceManager
+        .createInstanceWithContext("com.sun.star.frame.Desktop", 
xRemoteContext)
+        .query<XComponentLoader>();
+
+    string loadUrl = $"private:factory/{docType}";
+    return xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, new 
PropertyValue[0]);
+}
+
+XMultiComponentFactory GetRemoteServiceManager()
+{
+    if (xRemoteContext == null && xRemoteServiceManager == null)
+    {
+        xRemoteContext = NativeBootstrap.bootstrap();
+        Console.WriteLine("Connected to a running office ...");
+
+        xRemoteServiceManager = xRemoteContext.getServiceManager();
+    }
+    return xRemoteServiceManager;
+}
\ No newline at end of file
diff --git 
a/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/Makefile 
b/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/Makefile
new file mode 100644
index 000000000000..b30bfb7afcbd
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the HelloTextTableShape example of the Developers Guide.
+
+PRJ = ../../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = HelloTextTableShape
+APP_LANG = cs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/Makefile 
b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/Makefile
new file mode 100644
index 000000000000..5509df52153a
--- /dev/null
+++ b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the PathSettingsTest example of the Developers Guide.
+
+PRJ = ../../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = PathSettingsTest
+APP_LANG = cs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/PathSettingsTest.cs
 
b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/PathSettingsTest.cs
new file mode 100644
index 000000000000..b03f5abc2b00
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/csharp/PathSettingsTest.cs
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.beans;
+using com.sun.star.lang;
+using com.sun.star.uno;
+using com.sun.star.util;
+
+// List of pre-defined path variables supported by the PathSettings service
+string[] predefinedPathProperties =
+{
+    "Addin", "AutoCorrect", "AutoText", "Backup", "Basic",
+    "Bitmap", "Config", "Dictionary", "Favorite", "Filter",
+    "Gallery", "Graphic", "Help", "Linguistic", "Module",
+    "Palette", "Plugin", "Storage", "Temp", "Template",
+    "UIConfig", "UserConfig", "UserDictionary", "Work"
+};
+
+// Provides an example for accessing and using the PathSettings service
+try
+{
+    // Start a new office process and get the remote office context
+    XComponentContext context = NativeBootstrap.bootstrap();
+    Console.WriteLine("Connected to a running office...");
+
+    XPropertySet pathSettings = thePathSettings.get(context);
+    WorkWithPathSettings(pathSettings);
+
+    return 0;
+}
+catch (Exception e)
+{
+    Console.Error.WriteLine(e);
+
+    return 1;
+}
+
+// Retrieve and set path properties using the PathSettings service
+void WorkWithPathSettings(XPropertySet pathSettings)
+{
+    if (pathSettings != null)
+    {
+        foreach (string prop in predefinedPathProperties)
+        {
+            try
+            {
+                string value = 
pathSettings.getPropertyValue(prop).cast<string>();
+                Console.WriteLine($"Property = {prop} | Path = {value}");
+            }
+            catch (UnknownPropertyException)
+            {
+                Console.Error.WriteLine($"UnknownPropertyException was thrown 
while accessing {prop}");
+            }
+            catch (WrappedTargetException)
+            {
+                Console.Error.WriteLine($"WrappedTargetException was thrown 
while accessing {prop}");
+            }
+        }
+
+        // Try to modify the work path property.
+        // After running this example you should see the new value of "My 
Documents"
+        // in the Paths tab, accessible via "Tools - Options - LibreOffice - 
Paths".
+        // The change can be reverted through the Paths tab as well.
+        try
+        {
+            pathSettings.setPropertyValue("Work", new Any("$(temp)"));
+            string value = 
pathSettings.getPropertyValue("Work").cast<string>();
+            Console.WriteLine("Note: The example changes your current work 
path setting!");
+            Console.WriteLine($"The work path should now be {value}");
+        }
+        catch (UnknownPropertyException)
+        {
+            Console.Error.WriteLine("UnknownPropertyException was thrown while 
setting Work path");
+        }
+        catch (WrappedTargetException)
+        {
+            Console.Error.WriteLine("WrappedTargetException was thrown while 
setting Work path");
+        }
+        catch (PropertyVetoException)
+        {
+            Console.Error.WriteLine("PropertyVetoException was thrown while 
setting Work path");
+        }
+        catch (IllegalArgumentException)
+        {
+            Console.Error.WriteLine("IllegalArgumentException was thrown while 
setting Work path");
+        }
+    }
+}
diff --git a/odk/examples/DevelopersGuide/OfficeDev/PathSettings/Makefile 
b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/java/Makefile
similarity index 99%
rename from odk/examples/DevelopersGuide/OfficeDev/PathSettings/Makefile
rename to odk/examples/DevelopersGuide/OfficeDev/PathSettings/java/Makefile
index bc55266efb84..631f32a8a40f 100644
--- a/odk/examples/DevelopersGuide/OfficeDev/PathSettings/Makefile
+++ b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/java/Makefile
@@ -34,7 +34,7 @@
 
 # Builds the OfficeDevPathSettingsTest example of the Developers Guide.
 
-PRJ=../../../..
+PRJ=../../../../..
 SETTINGS=$(PRJ)/settings
 
 include $(SETTINGS)/settings.mk
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/PathSettings/PathSettingsTest.java 
b/odk/examples/DevelopersGuide/OfficeDev/PathSettings/java/PathSettingsTest.java
similarity index 100%
rename from 
odk/examples/DevelopersGuide/OfficeDev/PathSettings/PathSettingsTest.java
rename to 
odk/examples/DevelopersGuide/OfficeDev/PathSettings/java/PathSettingsTest.java
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/Makefile 
b/odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/Makefile
new file mode 100644
index 000000000000..363c4ca92587
--- /dev/null
+++ b/odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the PathSubstitutionTest example of the Developers Guide.
+
+PRJ = ../../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = PathSubstitutionTest
+APP_LANG = cs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/PathSubstitutionTest.cs
 
b/odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/PathSubstitutionTest.cs
new file mode 100644
index 000000000000..78a32fc9f773
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/OfficeDev/PathSubstitution/csharp/PathSubstitutionTest.cs
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.beans;
+using com.sun.star.container;
+using com.sun.star.lang;
+using com.sun.star.uno;
+using com.sun.star.util;
+
+// List of pre-defined path variables supported by the path substitution 
service
+string[] predefinedPathVariables =
+{
+    "$(home)","$(inst)","$(prog)","$(temp)","$(user)", "$(username)",
+    "$(work)","$(path)","$(langid)","$(vlang)"
+};
+
+try
+{
+    // Start a new office process and get the remote office context
+    XComponentContext context = NativeBootstrap.bootstrap();
+    Console.WriteLine("Connected to a running office...");
+
+    XStringSubstitution pathSubst = context.getServiceManager()
+        
.createInstanceWithContext("com.sun.star.comp.framework.PathSubstitution", 
context)
+        .query<XStringSubstitution>();
+    WorkWithPathVariables(pathSubst);
+
+    return 0;
+}
+catch (Exception e)
+{
+    Console.Error.WriteLine(e);
+
+    return 1;
+}
+
+void WorkWithPathVariables(XStringSubstitution pathSubst)
+{
+    if (pathSubst != null)
+    {
+        foreach (string pathVar in predefinedPathVariables)
+        {
+            try
+            {
+                string value = pathSubst.getSubstituteVariableValue(pathVar);
+                Console.WriteLine($"Property = {pathVar} | Path = {value}");
+            }
+            catch (NoSuchElementException)
+            {
+                Console.Error.WriteLine($"NoSuchElementException has been 
thrown accessing {pathVar}");
+            }
+        }
+
+        try
+        {
+            // Check the resubstitution function
+            // Use $(home) as starting point and extend the path
+            string value = 
pathSubst.getSubstituteVariableValue(predefinedPathVariables[0]);
+            value += "/test";
+            
+            Console.WriteLine($"Path = {value}");
+            string resub = pathSubst.reSubstituteVariables(value);
+            Console.WriteLine($"Resubstituted Path = {resub}");
+        }
+        catch (NoSuchElementException)
+        {
+            Console.Error.WriteLine($"NoSuchElementException has been thrown 
accessing {predefinedPathVariables[0]}");
+        }
+    }
+}
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/Makefile 
b/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/Makefile
new file mode 100644
index 000000000000..76d685fd3dcc
--- /dev/null
+++ b/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the TerminationTest example of the Developers Guide.
+
+PRJ = ../../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = TerminationTest
+APP_LANG = cs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminateListener.cs
 
b/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminateListener.cs
new file mode 100644
index 000000000000..bc794a6d146b
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminateListener.cs
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.frame;
+using com.sun.star.lang;
+using com.sun.star.uno;
+
+public class TerminateListener : WeakBase, XTerminateListener, XServiceInfo
+{
+    // XTerminateListener
+    public void notifyTermination(EventObject eventObject)
+    {
+        Console.WriteLine("About to terminate...");
+    }
+
+    public void queryTermination(EventObject eventObject)
+    {
+        if (Program.atWork)
+        {
+            Console.WriteLine("Terminate while we are at work? You can't be 
serious ;-)!");
+            throw new TerminationVetoException();
+        }
+    }
+
+    public void disposing(EventObject eventObject) { }
+
+    // XServiceInfo
+    public string getImplementationName() => GetType().FullName;
+
+    public bool supportsService(string serviceName) => serviceName == 
"com.sun.star.frame.XTerminateListener";
+
+    public string[] getSupportedServiceNames() => new[] { 
"com.sun.star.frame.XTerminateListener" };
+}
diff --git 
a/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminationTest.cs
 
b/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminationTest.cs
new file mode 100644
index 000000000000..2829514b104a
--- /dev/null
+++ 
b/odk/examples/DevelopersGuide/OfficeDev/TerminationTest/csharp/TerminationTest.cs
@@ -0,0 +1,57 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.frame;
+using com.sun.star.lang;
+using com.sun.star.uno;
+
+public class Program
+{
+    public static bool atWork = false;
+
+    private static int Main()
+    {
+        try
+        {
+            // Connect to a new instance of the Office
+            XComponentContext context = NativeBootstrap.bootstrap();
+            Console.WriteLine("Connected to a running office...");
+
+            // Get a reference to the Desktop service
+            XDesktop2 desktop = Desktop.create(context);
+
+            // Create our termination request listener, and register it
+            TerminateListener listener = new TerminateListener();
+            desktop.addTerminateListener(listener);
+
+            // Try to terminate while we are at work.
+            atWork = true;
+            bool terminated = desktop.terminate();
+            Console.WriteLine("The Office {0}", terminated
+                ? "has been terminated"
+                : "is still running, we are at work");
+
+            // Try to terminate when we are NOT at work.
+            atWork = false;
+            terminated = desktop.terminate();
+            Console.WriteLine("The Office {0}", terminated
+                ? "has been terminated"
+                : "is still running. Something else prevents termination, such 
as the quickstarter.");
+
+            return 0;
+        }
+        catch (Exception ex)
+        {
+            Console.Error.WriteLine(ex);
+
+            return 1;
+        }
+    }
+}
\ No newline at end of file
diff --git a/odk/examples/dotnet/WriterDemo/csharp/Makefile 
b/odk/examples/dotnet/WriterDemo/csharp/Makefile
new file mode 100644
index 000000000000..28992ec130d4
--- /dev/null
+++ b/odk/examples/dotnet/WriterDemo/csharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the WriterDemo example of the Developers Guide.
+
+PRJ = ../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = WriterDemo
+APP_LANG = cs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git a/odk/examples/dotnet/WriterDemo/csharp/WriterDemo.cs 
b/odk/examples/dotnet/WriterDemo/csharp/WriterDemo.cs
new file mode 100644
index 000000000000..de99e2029477
--- /dev/null
+++ b/odk/examples/dotnet/WriterDemo/csharp/WriterDemo.cs
@@ -0,0 +1,144 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+using System;
+
+using com.sun.star.awt;
+using com.sun.star.beans;
+using com.sun.star.bridge;
+using com.sun.star.container;
+using com.sun.star.drawing;
+using com.sun.star.frame;
+using com.sun.star.lang;
+using com.sun.star.text;
+using com.sun.star.table;
+using com.sun.star.uno;
+
+// Connect to a running office
+XComponentContext context = NativeBootstrap.bootstrap();
+// Create a service manager of the remote office
+XMultiComponentFactory factory = context.getServiceManager();
+
+// Create the Desktop
+XDesktop desktop = Desktop.create(context);
+
+// Open a new empty writer document
+XComponentLoader componentLoader = desktop.query<XComponentLoader>();
+XComponent component = componentLoader.loadComponentFromURL(
+    "private:factory/swriter", "_blank", 0, Array.Empty<PropertyValue>());
+
+XTextDocument textDocument = component.query<XTextDocument>();
+
+// Create a text object
+XText text = textDocument.getText();
+XSimpleText simpleText = text.query<XSimpleText>();
+
+// Create a cursor object
+XTextCursor cursor = simpleText.createTextCursor();
+
+// Inserting some Text
+text.insertString(cursor, "The first line in the newly created text document.
", false);
+
+// Create instance of a text table with 4 columns and 4 rows
+IQueryInterface textTableI = 
textDocument.query<XMultiServiceFactory>().createInstance("com.sun.star.text.TextTable");
+XTextTable textTable = textTableI.query<XTextTable>();
+textTable.initialize(4, 4);
+text.insertTextContent(cursor, textTable, false);
+
+// Set the table background color
+XPropertySet tablePropertySet = textTableI.query<XPropertySet>();
+tablePropertySet.setPropertyValue("BackTransparent", new Any(false));
+tablePropertySet.setPropertyValue("BackColor", new Any(0xCCCCFF));
+
+// Get first row
+XTableRows tableRows = textTable.getRows();
+Any rowAny = tableRows.query<XIndexAccess>().getByIndex(0);
+
+// Set a different background color for the first row
+XPropertySet firstRowPropertySet = rowAny.cast<XPropertySet>();
+firstRowPropertySet.setPropertyValue("BackTransparent", new Any(false));
+firstRowPropertySet.setPropertyValue("BackColor", new Any(0x6666AA));
+
+// Fill the first table row
+InsertIntoCell("A1", "FirstColumn", textTable);
+InsertIntoCell("B1", "SecondColumn", textTable);
+InsertIntoCell("C1", "ThirdColumn", textTable);
+InsertIntoCell("D1", "SUM", textTable);
+
+// Fill the remaining rows
+textTable.getCellByName("A2").setValue(22.5);
+textTable.getCellByName("B2").setValue(5615.3);
+textTable.getCellByName("C2").setValue(-2315.7);
+textTable.getCellByName("D2").setFormula("sum <A2:C2>");
+
+textTable.getCellByName("A3").setValue(21.5);
+textTable.getCellByName("B3").setValue(615.3);
+textTable.getCellByName("C3").setValue(-315.7);
+textTable.getCellByName("D3").setFormula("sum <A3:C3>");
+
+textTable.getCellByName("A4").setValue(121.5);
+textTable.getCellByName("B4").setValue(-615.3);
+textTable.getCellByName("C4").setValue(415.7);
+textTable.getCellByName("D4").setFormula("sum <A4:C4>");
+
+// Change the CharColor and add a Shadow
+XPropertySet cursorPropertySet = cursor.query<XPropertySet>();
+cursorPropertySet.setPropertyValue("CharColor", new Any(255));
+cursorPropertySet.setPropertyValue("CharShadowed", new Any(true));
+
+// Create a paragraph break
+simpleText.insertControlCharacter(cursor, ControlCharacter.PARAGRAPH_BREAK, 
false);
+
+// Inserting colored Text.
+simpleText.insertString(cursor, " This is a colored Text - blue with shadow
", false);
+
+// Create a paragraph break
+simpleText.insertControlCharacter(cursor, ControlCharacter.PARAGRAPH_BREAK, 
false);
+
+// Create a TextFrame.
+IQueryInterface textFrameI = 
textDocument.query<XMultiServiceFactory>().createInstance("com.sun.star.text.TextFrame");
+XTextFrame textFrame = textFrameI.query<XTextFrame>();
+
+// Set the size of the frame
+Size size = new Size(15000, 400);
+textFrame.query<XShape>().setSize(size);
+
+// Set anchortype
+XPropertySet framePropertySet = textFrame.query<XPropertySet>();
+framePropertySet.setPropertyValue("AnchorType", new 
Any(TextContentAnchorType.AS_CHARACTER));
+
+// Insert the frame
+text.insertTextContent(cursor, textFrame, false);
+
+// Get the text object of the frame
+XText frameText = textFrame.getText();
+XSimpleText frameSimpleText = frameText.query<XSimpleText>();
+
+// Create a cursor object
+XTextCursor frameCursor = frameSimpleText.createTextCursor();
+
+// Inserting some Text
+frameSimpleText.insertString(frameCursor, "The first line in the newly created 
text frame.", false);
+frameSimpleText.insertString(frameCursor, "
With this second line the height of the frame raises.", false);
+
+// Create a paragraph break
+simpleText.insertControlCharacter(frameCursor, 
ControlCharacter.PARAGRAPH_BREAK, false);
+
+// Change the CharColor and add a Shadow
+cursorPropertySet.setPropertyValue("CharColor", new Any(65536));
+cursorPropertySet.setPropertyValue("CharShadowed", new Any(false));
+
+// Insert another string
+text.insertString(cursor, "
 That's all for now !!", false);
+
+void InsertIntoCell(string cellName, string text, XTextTable textTable)
+{
+    XCell cell = textTable.getCellByName(cellName);
+    XSimpleText simpleText = cell.query<XSimpleText>();
+    simpleText.setString(text);
+}
\ No newline at end of file
diff --git a/odk/examples/dotnet/WriterDemo/fsharp/Makefile 
b/odk/examples/dotnet/WriterDemo/fsharp/Makefile
new file mode 100644
index 000000000000..d3aaad0c6499
--- /dev/null
+++ b/odk/examples/dotnet/WriterDemo/fsharp/Makefile
@@ -0,0 +1,75 @@
+# Builds the WriterDemo example of the Developers Guide.
+
+PRJ = ../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = WriterDemo
+APP_LANG = fs
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git a/odk/examples/dotnet/WriterDemo/fsharp/WriterDemo.fs 
b/odk/examples/dotnet/WriterDemo/fsharp/WriterDemo.fs
new file mode 100644
index 000000000000..e486dbece220
--- /dev/null
+++ b/odk/examples/dotnet/WriterDemo/fsharp/WriterDemo.fs
@@ -0,0 +1,139 @@
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+open System
+open com.sun.star.awt
+open com.sun.star.beans
+open com.sun.star.bridge
+open com.sun.star.container
+open com.sun.star.drawing
+open com.sun.star.frame
+open com.sun.star.lang
+open com.sun.star.text
+open com.sun.star.table
+open com.sun.star.uno
+
+let InsertIntoCell (cellName: string, text: string, textTable: XTextTable) =
+    let cell = textTable.getCellByName(cellName)
+    let simpleText = cell.query<XSimpleText>()
+    simpleText.setString(text)
+
+// Connect to a running office
+let context = NativeBootstrap.bootstrap()
+// Create a service manager of the remote office
+let factory = context.getServiceManager()
+
+// Create the Desktop
+let desktop = Desktop.create(context)
+
+// Open a new empty writer document
+let componentLoader = desktop.query<XComponentLoader>()
+let component_ = componentLoader.loadComponentFromURL(
+    "private:factory/swriter", "_blank", 0, [||])
+
+let textDocument = component_.query<XTextDocument>()
+
+// Create a text object
+let text = textDocument.getText()
+let simpleText = text.query<XSimpleText>()
+
+// Create a cursor object
+let cursor = simpleText.createTextCursor()
+
+// Inserting some Text
+text.insertString(cursor, "The first line in the newly created text document." 
+ Environment.NewLine, false)
+
+// Create instance of a text table with 4 columns and 4 rows
+let textTableI = 
textDocument.query<XMultiServiceFactory>().createInstance("com.sun.star.text.TextTable")
+let textTable = textTableI.query<XTextTable>()
+textTable.initialize(4, 4)
+text.insertTextContent(cursor, textTable, false)
+
+// Set the table background color
+let tablePropertySet = textTableI.query<XPropertySet>()
+tablePropertySet.setPropertyValue("BackTransparent", new Any(false))
+tablePropertySet.setPropertyValue("BackColor", new Any(0xCCCCFF))
+
+// Get first row
+let tableRows = textTable.getRows()
+let rowAny = tableRows.query<XIndexAccess>().getByIndex(0)
+
+// Set a different background color for the first row
+let firstRowPropertySet = rowAny.cast<XPropertySet>()
+firstRowPropertySet.setPropertyValue("BackTransparent", new Any(false))
+firstRowPropertySet.setPropertyValue("BackColor", new Any(0x6666AA))
+
+// Fill the first table row
+InsertIntoCell("A1", "FirstColumn", textTable)
+InsertIntoCell("B1", "SecondColumn", textTable)
+InsertIntoCell("C1", "ThirdColumn", textTable)
+InsertIntoCell("D1", "SUM", textTable)
+
+// Fill the remaining rows
+textTable.getCellByName("A2").setValue(22.5)
+textTable.getCellByName("B2").setValue(5615.3)
+textTable.getCellByName("C2").setValue(-2315.7)
+textTable.getCellByName("D2").setFormula("sum <A2:C2>")
+
+textTable.getCellByName("A3").setValue(21.5)
+textTable.getCellByName("B3").setValue(615.3)
+textTable.getCellByName("C3").setValue(-315.7)
+textTable.getCellByName("D3").setFormula("sum <A3:C3>")
+
+textTable.getCellByName("A4").setValue(121.5)
+textTable.getCellByName("B4").setValue(-615.3)
+textTable.getCellByName("C4").setValue(415.7)
+textTable.getCellByName("D4").setFormula("sum <A4:C4>")
+
+// Change the CharColor and add a Shadow
+let cursorPropertySet = cursor.query<XPropertySet>()
+cursorPropertySet.setPropertyValue("CharColor", new Any(255))
+cursorPropertySet.setPropertyValue("CharShadowed", new Any(true))
+
+// Create a paragraph break
+simpleText.insertControlCharacter(cursor, ControlCharacter.PARAGRAPH_BREAK, 
false)
+
+// Inserting colored Text.
+simpleText.insertString(cursor, " This is a colored Text - blue with shadow" + 
Environment.NewLine, false)
+
+// Create a paragraph break
+simpleText.insertControlCharacter(cursor, ControlCharacter.PARAGRAPH_BREAK, 
false)
+
+// Create a TextFrame.
+let textFrameI = 
textDocument.query<XMultiServiceFactory>().createInstance("com.sun.star.text.TextFrame")
+let textFrame = textFrameI.query<XTextFrame>()
+
+// Set the size of the frame
+let size = Size(15000, 400)
+textFrame.query<XShape>().setSize(size)
+
+// Set anchortype
+let framePropertySet = textFrame.query<XPropertySet>()
+framePropertySet.setPropertyValue("AnchorType", new 
Any(TextContentAnchorType.AS_CHARACTER))
+
+// Insert the frame
+text.insertTextContent(cursor, textFrame, false)
+
+// Get the text object of the frame
+let frameText = textFrame.getText()
+let frameSimpleText = frameText.query<XSimpleText>()
+
+// Create a cursor object
+let frameCursor = frameSimpleText.createTextCursor()
+
+// Inserting some Text
+frameSimpleText.insertString(frameCursor, "The first line in the newly created 
text frame.", false)
+frameSimpleText.insertString(frameCursor, Environment.NewLine + "With this 
second line the height of the frame raises.", false)
+
+// Create a paragraph break
+simpleText.insertControlCharacter(frameCursor, 
ControlCharacter.PARAGRAPH_BREAK, false)
+
+// Change the CharColor and add a Shadow
+cursorPropertySet.setPropertyValue("CharColor", new Any(65536))
+cursorPropertySet.setPropertyValue("CharShadowed", new Any(false))
+
+// Insert another string
+text.insertString(cursor, Environment.NewLine + " That's all for now !!", 
false)
diff --git a/odk/examples/dotnet/WriterDemo/vbasic/Makefile 
b/odk/examples/dotnet/WriterDemo/vbasic/Makefile
new file mode 100644
index 000000000000..01014c71a820
--- /dev/null
+++ b/odk/examples/dotnet/WriterDemo/vbasic/Makefile
@@ -0,0 +1,75 @@
+# Builds the WriterDemo example of the Developers Guide.
+
+PRJ = ../../../..
+SETTINGS = $(PRJ)/settings
+
+include $(SETTINGS)/settings.mk
+include $(SETTINGS)/std.mk
+
+# Settings
+APP_NAME = WriterDemo
+APP_LANG = vb
+
+APP_SRC_DIR = $(subst /,$(PS),$(CURDIR))
+APP_BIN_DIR = $(subst /,$(PS),$(OUT_BIN))
+APP_MISC_DIR = $(subst /,$(PS),$(OUT_MISC)/$(APP_NAME))
+
+APP_PROJ_NAME = $(APP_NAME).$(APP_LANG)proj
+APP_PROJ_FILE = $(APP_MISC_DIR)/$(APP_PROJ_NAME)
+
+APP_EXE_NAME = $(APP_NAME)$(EXE_EXT)
+APP_EXE_FILE = $(APP_BIN_DIR)/$(APP_EXE_NAME)
+
+DOTNET_FLAGS = -c Release
+LO_NUPKG_ID = LibreOffice.Bindings
+LO_NUPKG_VERSION = 0.1.0
+LO_NUPKG_DIR = $(abspath $(PRJ)/dotnet)
+
+# Targets
+.PHONY: ALL
+ALL : $(APP_NAME)
+
+include $(SETTINGS)/stdtarget.mk
+
+$(APP_PROJ_FILE) :
+       -$(MKDIR) $(@D)
+       $(ECHO) "<Project Sdk=\"Microsoft.NET.Sdk\">" > $@
+       $(ECHO) "    <PropertyGroup>" >> $@
+       $(ECHO) "        <AssemblyName>$(APP_NAME)</AssemblyName>" >> $@
+       $(ECHO) "        <TargetFramework>net8.0</TargetFramework>" >> $@
+       $(ECHO) "        <OutputType>exe</OutputType>" >> $@
+       $(ECHO) "        <PublishSingleFile>true</PublishSingleFile>" >> $@
+       $(ECHO) "        <SelfContained>false</SelfContained>" >> $@
+       $(ECHO) "        
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>" >> $@
+       $(ECHO) "        
<RestoreAdditionalProjectSources>$(LO_NUPKG_DIR)</RestoreAdditionalProjectSources>"
 >> $@
+       $(ECHO) "    </PropertyGroup>" >> $@
+       $(ECHO) "    <ItemGroup>" >> $@
+       $(ECHO) "        <PackageReference Include=\"$(LO_NUPKG_ID)\" 
Version=\"$(LO_NUPKG_VERSION)\" />" >> $@
+       $(ECHO) "        <Compile Include=\"$(APP_SRC_DIR)/*.$(APP_LANG)\" />" 
>> $@
+       $(ECHO) "    </ItemGroup>" >> $@
+       $(ECHO) "</Project>" >> $@
+       $(ECHOLINE) >> $@
+
+$(APP_EXE_FILE) : $(APP_PROJ_FILE)
+       -$(MKDIR) $(@D)
+       $(SDK_DOTNET) publish $< $(DOTNET_FLAGS) -o $(<D)
+       $(COPY) $(<D)/$(APP_EXE_NAME) $@
+
+.PHONY: $(APP_NAME)
+$(APP_NAME) : $(APP_EXE_FILE)
+       $(ECHO) --------------------------------------------------------
+       $(ECHO) Use the following commands to run the example:
+       $(ECHO) $(MAKE) run OR $(MAKE) $(APP_NAME).run
+       $(ECHO)
+       $(ECHO) And the following commands to clean the example:
+       $(ECHO) $(MAKE) clean OR $(MAKE) $(APP_NAME).clean
+       $(ECHO) --------------------------------------------------------
+
+.PHONY: $(APP_NAME).run run
+$(APP_NAME).run run : $(APP_EXE_FILE)
+       cd $(<D) && ./$(<F)
+
+.PHONY: $(APP_NAME).clean clean
+$(APP_NAME).clean clean :
+       -$(DELRECURSIVE) $(APP_MISC_DIR)
+       -$(DEL) $(APP_EXE_FILE)
diff --git a/odk/examples/dotnet/WriterDemo/vbasic/WriterDemo.vb 
b/odk/examples/dotnet/WriterDemo/vbasic/WriterDemo.vb
new file mode 100644
index 000000000000..be9b076f47e0
--- /dev/null
+++ b/odk/examples/dotnet/WriterDemo/vbasic/WriterDemo.vb
@@ -0,0 +1,145 @@
+' This file is part of the LibreOffice project.
+'
+' This Source Code Form is subject to the terms of the Mozilla Public
+' License, v. 2.0. If a copy of the MPL was not distributed with this
+' file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+Imports System
+
+Imports com.sun.star.awt
+Imports com.sun.star.beans
+Imports com.sun.star.bridge
+Imports com.sun.star.container
+Imports com.sun.star.drawing
+Imports com.sun.star.frame
+Imports com.sun.star.lang
+Imports com.sun.star.text
+Imports com.sun.star.table
+Imports com.sun.star.uno
+
+Module WriterDemo
+    Sub Main()
+        ' Connect to a running office
+        Dim context As XComponentContext = NativeBootstrap.bootstrap()
+        ' Create a service manager of the remote office
+        Dim factory As XMultiComponentFactory = context.getServiceManager()
+
+        ' Create the Desktop
+        Dim desktop_ As XDesktop = Desktop.create(context)
+
+        ' Open a new empty writer document
+        Dim componentLoader As XComponentLoader = desktop_.query(Of 
XComponentLoader)()
+        Dim component As XComponent = componentLoader.loadComponentFromURL(
+            "private:factory/swriter", "_blank", 0, Array.Empty(Of 
PropertyValue)())
+
+        Dim textDocument As XTextDocument = component.query(Of XTextDocument)()
+
+        ' Create a text object
+        Dim text As XText = textDocument.getText()
+        Dim simpleText As XSimpleText = text.query(Of XSimpleText)()
+
+        ' Create a cursor object
+        Dim cursor As XTextCursor = simpleText.createTextCursor()
+
+        ' Inserting some Text
+        text.insertString(cursor, "The first line in the newly created text 
document." & vbLf, False)
+
+        ' Create instance of a text table with 4 columns and 4 rows
+        Dim textTableI As IQueryInterface = textDocument.query(Of 
XMultiServiceFactory)().createInstance("com.sun.star.text.TextTable")
+        Dim textTable As XTextTable = textTableI.query(Of XTextTable)()
+        textTable.initialize(4, 4)
+        text.insertTextContent(cursor, textTable, False)
+
+        ' Set the table background color
+        Dim tablePropertySet As XPropertySet = textTableI.query(Of 
XPropertySet)()
+        tablePropertySet.setPropertyValue("BackTransparent", New Any(False))
+        tablePropertySet.setPropertyValue("BackColor", New Any(&HCCCCFF))
+
+        ' Get first row
+        Dim tableRows As XTableRows = textTable.getRows()
+        Dim rowAny As Any = tableRows.query(Of XIndexAccess)().getByIndex(0)
+
+        ' Set a different background color for the first row
+        Dim firstRowPropertySet As XPropertySet = rowAny.cast(Of 
XPropertySet)()
+        firstRowPropertySet.setPropertyValue("BackTransparent", New Any(False))
+        firstRowPropertySet.setPropertyValue("BackColor", New Any(&H6666AA))
+
+        ' Fill the first table row
+        InsertIntoCell("A1", "FirstColumn", textTable)
+        InsertIntoCell("B1", "SecondColumn", textTable)
+        InsertIntoCell("C1", "ThirdColumn", textTable)
+        InsertIntoCell("D1", "SUM", textTable)
+
+        ' Fill the remaining rows
+        textTable.getCellByName("A2").setValue(22.5)
+        textTable.getCellByName("B2").setValue(5615.3)
+        textTable.getCellByName("C2").setValue(-2315.7)
+        textTable.getCellByName("D2").setFormula("sum <A2:C2>")
+
+        textTable.getCellByName("A3").setValue(21.5)
+        textTable.getCellByName("B3").setValue(615.3)
+        textTable.getCellByName("C3").setValue(-315.7)
+        textTable.getCellByName("D3").setFormula("sum <A3:C3>")
+
+        textTable.getCellByName("A4").setValue(121.5)
+        textTable.getCellByName("B4").setValue(-615.3)
+        textTable.getCellByName("C4").setValue(415.7)
+        textTable.getCellByName("D4").setFormula("sum <A4:C4>")
+
+        ' Change the CharColor and add a Shadow
+        Dim cursorPropertySet As XPropertySet = cursor.query(Of XPropertySet)()
+        cursorPropertySet.setPropertyValue("CharColor", New Any(255))
+        cursorPropertySet.setPropertyValue("CharShadowed", New Any(True))
+
+        ' Create a paragraph break
+        simpleText.insertControlCharacter(cursor, 
ControlCharacter.PARAGRAPH_BREAK, False)
+
+        ' Inserting colored Text.
+        simpleText.insertString(cursor, " This is a colored Text - blue with 
shadow" & vbLf, False)
+
+        ' Create a paragraph break
+        simpleText.insertControlCharacter(cursor, 
ControlCharacter.PARAGRAPH_BREAK, False)
+
+        ' Create a TextFrame.
+        Dim textFrameI As IQueryInterface = textDocument.query(Of 
XMultiServiceFactory)().createInstance("com.sun.star.text.TextFrame")
+        Dim textFrame As XTextFrame = textFrameI.query(Of XTextFrame)()
+
+        ' Set the size of the frame
+        Dim size As Size = New Size(15000, 400)
+        textFrame.query(Of XShape)().setSize(size)
+
+        ' Set anchortype
+        Dim framePropertySet As XPropertySet = textFrame.query(Of 
XPropertySet)()
+        framePropertySet.setPropertyValue("AnchorType", New 
Any(TextContentAnchorType.AS_CHARACTER))
+
+        ' Insert the frame
+        text.insertTextContent(cursor, textFrame, False)
+
+        ' Get the text object of the frame
+        Dim frameText As XText = textFrame.getText()
+        Dim frameSimpleText As XSimpleText = frameText.query(Of XSimpleText)()
+
+        ' Create a cursor object
+        Dim frameCursor As XTextCursor = frameSimpleText.createTextCursor()
+
+        ' Inserting some Text
+        frameSimpleText.insertString(frameCursor, "The first line in the newly 
created text frame.", False)
+        frameSimpleText.insertString(frameCursor, vbLf & "With this second 
line the height of the frame raises.", False)
+
+        ' Create a paragraph break
+        simpleText.insertControlCharacter(frameCursor, 
ControlCharacter.PARAGRAPH_BREAK, False)
+
+        ' Change the CharColor and add a Shadow
+        cursorPropertySet.setPropertyValue("CharColor", New Any(65536))
+        cursorPropertySet.setPropertyValue("CharShadowed", New Any(False))
+
+        ' Insert another string
+        text.insertString(cursor, vbLf & " That's all for now !!", False)
+    End Sub
+
+    Private Sub InsertIntoCell(cellName As String, text As String, textTable 
As XTextTable)
+        Dim cell As XCell = textTable.getCellByName(cellName)
+        Dim simpleText As XSimpleText = cell.query(Of XSimpleText)()
+        simpleText.setString(text)
+    End Sub
+End Module
\ No newline at end of file

Reply via email to