starmessage / libSoftMeter

Application analytics (software usage analytics) for Windows, MacOS and IOS software
https://www.starmessagesoftware.com/softmeter
Other
50 stars 23 forks source link

C# code samples for using SoftMeter to connect a csharp application with Google Analytics #10

Closed starmessage closed 4 years ago

starmessage commented 5 years ago

Post some C# code samples that showcase how to call the SoftMeter dll from a C# application, to send usage analytics data to Google Analytics.

The DLL must be loaded only once and subsequent calls to the functions of the DLL must be directed to the same instance of the loaded DLL so that internal state is preserved.

It is desirable to have a runtime loading that if the DLL file is missing, the program can continue to run. ("Static" loading does not allow the program to continue).

danielsavi commented 4 years ago

` [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)] private static extern string getVersion();

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern string getLogFilename();

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern void enableLogfile([MarshalAs(UnmanagedType.LPStr)]string appName, [MarshalAs(UnmanagedType.LPStr)]string macBundleId);

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern void disableLogfile();

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern bool start([MarshalAs(UnmanagedType.LPStr)]string appName, [MarshalAs(UnmanagedType.LPStr)]string appVersion,
                                     [MarshalAs(UnmanagedType.LPStr)]string appLicense, [MarshalAs(UnmanagedType.LPStr)]string appEdition,
                                     [MarshalAs(UnmanagedType.LPStr)]string propertyID, bool userGaveConsent);

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern void stop();

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern bool sendPageview([MarshalAs(UnmanagedType.LPStr)]string pagePath, [MarshalAs(UnmanagedType.LPStr)]string pageTitle);

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern bool sendScreenview([MarshalAs(UnmanagedType.LPStr)]string screenName);

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern bool sendEvent([MarshalAs(UnmanagedType.LPStr)]string eventAction, [MarshalAs(UnmanagedType.LPStr)]string eventLabel, int eventValue);

    [DllImport("libSoftMeter.dll", CharSet = CharSet.Ansi)]
    private static extern bool sendException([MarshalAs(UnmanagedType.LPStr)]string exceptionDescription, bool isFatal);

`

starmessage commented 4 years ago

a C# load DLL code sample that compiles and runs ok (for SoftMeter application analytics)

public static class SoftMeterDLL
{

    public const string DLL_FILE_NAME = "libSoftMeter64.dll"; // for 64bit  software
    //public const string DLL_FILE_NAME = "libSoftMeter.dll"; // for 32bit software

    [DllImport(DLL_FILE_NAME)]
    internal static extern IntPtr getVersion(); // If a C++ DLL function returns char*, C# code will treat it as IntPtr and Marshal.PtrToStringAnsi() will convert it into C# string.

    [DllImport(DLL_FILE_NAME)]
    internal static extern IntPtr getLogFilename();

    [DllImport(DLL_FILE_NAME)]
    internal static extern void enableLogfile([MarshalAs(UnmanagedType.LPStr)]string appName, [MarshalAs(UnmanagedType.LPStr)]string macBundleId);

    [DllImport(DLL_FILE_NAME)]
    internal static extern void disableLogfile();

    [DllImport(DLL_FILE_NAME)]
    internal static extern bool start([MarshalAs(UnmanagedType.LPStr)]string appName, [MarshalAs(UnmanagedType.LPStr)]string appVersion,
                                        [MarshalAs(UnmanagedType.LPStr)]string appLicense, [MarshalAs(UnmanagedType.LPStr)]string appEdition,
                                        [MarshalAs(UnmanagedType.LPStr)]string propertyID, bool userGaveConsent);

    [DllImport(DLL_FILE_NAME)]
    internal static extern void stop();

    [DllImport(DLL_FILE_NAME)]
    internal static extern bool sendPageview([MarshalAs(UnmanagedType.LPStr)]string pagePath, [MarshalAs(UnmanagedType.LPStr)]string pageTitle);

    [DllImport(DLL_FILE_NAME)]
    internal static extern bool sendScreenview([MarshalAs(UnmanagedType.LPStr)]string screenName);

    [DllImport(DLL_FILE_NAME)]
    internal static extern bool sendEvent([MarshalAs(UnmanagedType.LPStr)]string eventAction, [MarshalAs(UnmanagedType.LPStr)]string eventLabel, int eventValue);

    [DllImport(DLL_FILE_NAME)]
    internal static extern bool sendException([MarshalAs(UnmanagedType.LPStr)]string exceptionDescription, bool isFatal);

}

Then inside the application call the SoftMeter functions to send hits to Google Analytics (or Piwik/Matomo)

namespace Demo_WpfApp_win
{

    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            // SoftMeter initialization
            bool UserGaveConsent = true; // load this from your user settings file
            lblLibVer.Content = Marshal.PtrToStringAnsi(SoftMeterDLL.getVersion()); // show the dll version 
            string appName = "SoftMeter C-sharp DemoApp";
            string appVersion = "0.9";
            string appLicense = "pro";
            string appEdition = "ms store"; // the edition uploaded to the Microsoft store

            string trackingID = "UA-1234-1"; // replace this with your own Google PropertyID
            SoftMeterDLL.enableLogfile(appName, "");
            SoftMeterDLL.start(appName, appVersion, appLicense, appEdition, trackingID, UserGaveConsent);

            SoftMeterDLL.sendPageview("main","MainWindow");
            SoftMeterDLL.sendScreenview("MainWindow");

        }

        ~MainWindow()
        {
            SoftMeterDLL.stop();
        }

    }
}
starmessage commented 4 years ago

https://www.starmessagesoftware.com/blog/how-monitor-your-c-sharp-application-google-analytics-or-matomopiwik