This page explains how to integrate Receigen with a .NET application running on Mono. Note that this guide only covers the initial Receipt Validation.

The integration is similar to the standard embedding. Here is a sample code for the integration:

#include <stdlib.h>
#include <zlib.h>
#include <mono/metadata/assembly.h>
#include "monobjc.h"

// Receigen inclusion
#define RUNNER mono_main // <= This is the function called when validation succeeds
#include "receipt.h"     // <= Receigen generated code

// Symbols for assemblies
extern const unsigned char mscorlib_dll[];
extern const unsigned char System_Configuration_dll[];
extern const unsigned char System_Core_dll[];
extern const unsigned char System_dll[];
extern const unsigned char System_Security_dll[];
extern const unsigned char System_Xml_dll[];
extern const unsigned char MyApplication.exe[];

// Symbol for machine configuration
extern const char machine_config[];

// Bundle for assemblies
static MonoBundledAssembly bundle_mscorlib_dll = { "mscorlib.dll", mscorlib_dll, 2938880 };
static MonoBundledAssembly bundle_System_Configuration_dll = { "System.Configuration.dll", System_Configuration_dll, 127488 };
static MonoBundledAssembly bundle_System_Core_dll = { "System.Core.dll", System_Core_dll, 738816 };
static MonoBundledAssembly bundle_System_dll = { "System.dll", System_dll, 1734144,  };
static MonoBundledAssembly bundle_System_Security_dll = { "System.Security.dll", System_Security_dll, 132096 };
static MonoBundledAssembly bundle_System_Xml_dll = { "System.Xml.dll", System_Xml_dll, 1303040 };
static MonoBundledAssemblyExt bundle_MyApplication_exe = { "MyApplication.exe", MyApplication_exe, 69120 };

static char *image_name = "MyApplication.exe";

int main(int argc, char* argv[]) {
    int i;

    MonoBundledAssembly *bundled[8];
    bundled[0] = &bundle_mscorlib_dll;
    bundled[1] = &bundle_System_Configuration_dll;
    bundled[2] = &bundle_System_Core_dll;
    bundled[3] = &bundle_System_dll;
    bundled[4] = &bundle_System_Security_dll;
    bundled[5] = &bundle_System_Xml_dll;
    bundled[6] = &bundle_MyApplication_exe;
    bundled[7] = NULL;

    // Shift the arguments to include the image name
    char **newargs = (char **) malloc (sizeof(char *) * (argc + 2));
    newargs [0] = argv[0];
    newargs [1] = image_name;
    for(i = 1; i < argc; i++) {
        newargs[i+1] = argv [i];
    }
    newargs[++i] = NULL;

    // Registers the configurations and the assemblies
    mono_register_machine_config(machine_config);
    mono_register_bundled_assemblies((const MonoBundledAssembly **) bundled);

    // Invoke the Mono runtime
    return CheckReceiptAndRun(argc + 1, newargs);
}