Dev Space

Customize & extend the power of Alteryx. SDKs, APIs, custom tools, and more!
Don't forget to submit your entry for the Excellence Awards by October 30! | Need more information about the program? Check out the blog here

Custom formula with C++ and a .NET DLL?

Highlighted
5 - Atom

Hi there,

 

I'm trying to switch over some custom functions from SQL (which used C#.NET) to Alteryx.

 

I have the basics setup so the C++ program can use the .NET DLL. However, when I try to use it with Alteryx, it doesn't seem to work.

 

Is there some way I can debug it better? It just keeps giving me "An unknown error occurred in II_INIT" in the formula.

 

Thank you, Sam

Highlighted
16 - Nebula
16 - Nebula

Cross between unmanaged C++ (which Alteryx runs) and C# is difficult. There are a couple of options:

 

1. Rewrite the custom function code in C++ and keep it all unmanaged

2. Use the deprecated C# custom tool SDK (its within APIs\SampleCode\CustomDotNetTools)

3. Look at using DllExport in C# (https://www.nuget.org/packages/DllExport/) to make the C# function exposed to unmanaged C++

 

2 has a limited lifespan as deprecated and due to be retired at end of 2021.

 

If you can share some code can probably make some more progress

Highlighted
5 - Atom

Here's some simple code examples that I've tried:

 

This is exported as a .NET 4.7.2 DLL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace clsTest
{
    public class tester
    {
        int number;
        public tester(int numb)
        {
            number = numb;
        }

        public int testIt()
        {
            return number * 10;
        }
    }
}

 This is the custom function code

#include "AlteryxFunction.h"
#using <C:\Users\00007341\source\repos\alteryxReins\x64\Debug\clsTest.dll>

using namespace clsTest;

extern "C" long _declspec(dllexport) _stdcall getReinsPerc(int nNumArgs, FormulaAddInData * pArgs, FormulaAddInData * pReturnValue)
{

    pReturnValue->nVarType = nVarType_DOUBLE;

    clsTest::tester^ num = gcnew clsTest::tester(10);

    int testedNumb = num->testIt();

    pReturnValue->isNull = 0;
    pReturnValue->dVal = testedNumb;
    return 1;
}

 

If I do something even simpler, like this:

 

#include "AlteryxFunction.h"
#using <C:\Users\00007341\source\repos\alteryxReins\x64\Debug\clsTest.dll>

using namespace clsTest;

extern "C" long _declspec(dllexport) _stdcall getReinsPerc(int nNumArgs, FormulaAddInData * pArgs, FormulaAddInData * pReturnValue)
{
    pReturnValue->nVarType = nVarType_DOUBLE;

    pReturnValue->isNull = 0;
    pReturnValue->dVal = 5;
    return 1;
}

It works just fine.

 

I'll look into your suggestions, thank you!

Highlighted
16 - Nebula
16 - Nebula

Unfortunately gcnew requires CLR C++ which can't be used within the custom formula stuff. I'll have a play this evening and see what I can come up with for you.